0

首先,我使用的是 Laravel 5.1(PHP 框架)并且我正在运行 PHP 5.6.4,而我面临的问题实际上与递归有关。

我目前的种子文件是(递归函数的借口很糟糕):

    <?php

use Illuminate\Database\Seeder;
use Illuminate\Database\Migrations\Migration;
use eCommerce\Category;

class CategoryCategorySeeder extends Seeder
{

   protected $addressHolder;

   public function __construct() {
      $this->addressHolder = array();
   }

   private function recursive($array, $depth=0) {
      echo $depth."\n";
      foreach($array as $category){

         // print_r( $category['category_id'] );

         if( isset( $category['sub_categories'] ) ){            
            $this->recursive($category['sub_categories'], $depth++);
         } else {

         }
      }
   }

    public function run()
    {
        DB::table('category_category')->delete();
        $categories = [

            [
               'category_id' => 2,
               'sub_categories' => [
                  [
                     'category_id' => 3,
                     'sub_categories' => [
                        [
                           'category_id' => 6
                        ],[
                           'category_id' => 7
                        ],[
                           'category_id' => 8
                        ],[
                           'category_id' => 9
                        ],[
                           'category_id' => 10
                        ],[
                           'category_id' => 11
                        ],[
                           'category_id' => 12
                        ],[
                           'category_id' => 13
                        ],[
                           'category_id' => 14
                        ],[
                           'category_id' => 15
                        ]
                     ]
                  ],[
                     'category_id' => 4,
                     'sub_categories' => [
                        [
                           'category_id' => 18
                        ],[
                           'category_id' => 19
                        ],[
                           'category_id' => 20
                        ],[
                           'category_id' => 21
                        ],[
                           'category_id' => 22
                        ],[
                           'category_id' => 23
                        ],[
                           'category_id' => 24
                        ],[
                           'category_id' => 25
                        ],[
                           'category_id' => 26
                        ],[
                           'category_id' => 27
                        ],[
                           'category_id' => 28
                        ],[
                           'category_id' => 29
                        ],[
                           'category_id' => 30
                        ],[
                           'category_id' => 31
                        ],[
                           'category_id' => 32
                        ]
                     ]
                  ],[
                     'category_id' => 5,
                     'sub_categories' => [
                        [
                           'category_id' => 16
                        ],[
                           'category_id' => 17
                        ]
                     ]
                  ]
               ]
            ],[
               'category_id' => 33,
               'sub_categories' => [
                  [
                     'category_id' => 34
                  ],[
                     'category_id' => 35
                  ],[
                     'category_id' => 36,
                     'sub_categories' => [
                        [
                           'category_id' => 37
                        ],[
                           'category_id' => 38
                        ],[
                           'category_id' => 39
                        ],[
                           'category_id' => 40
                        ],[
                           'category_id' => 41
                        ],[
                           'category_id' => 42
                        ],[
                           'category_id' => 43
                        ],[
                           'category_id' => 44
                        ],[
                           'category_id' => 45
                        ]
                     ]
                  ]
               ]
            ],[
               'category_id' => 46,
               'sub_categories' => [
                  [
                     'category_id' => 50
                  ],[
                     'category_id' => 51,
                     'sub_categories' => [
                        [
                           'category_id' => 54
                        ],[
                           'category_id' => 55
                        ],[
                           'category_id' => 56
                        ],[
                           'category_id' => 57
                        ]
                     ]                     
                  ],[
                     'category_id' => 52
                  ],[
                     'category_id' => 53
                  ],[
                     'category_id' => 137
                  ]
               ]
            ],[
               'category_id' => 47,
               'sub_categories' => [
                  [
                     'category_id' => 58
                  ],[
                     'category_id' => 59
                  ],[
                     'category_id' => 60
                  ],[
                     'category_id' => 61
                  ],[
                     'category_id' => 62
                  ],[
                     'category_id' => 63
                  ],[
                     'category_id' => 64
                  ],[
                     'category_id' => 65
                  ],[
                     'category_id' => 66
                  ],[
                     'category_id' => 67
                  ],[
                     'category_id' => 68
                  ],[
                     'category_id' => 69
                  ],[
                     'category_id' => 70
                  ],[
                     'category_id' => 71
                  ],[
                     'category_id' => 72
                  ]
               ]
            ],[
               'category_id' => 48,
               'sub_categories' => [
                  [
                     'category_id' => 73,
                     'sub_categories' => [
                        [
                           'category_id' => 78
                        ],[
                           'category_id' => 79
                        ]
                     ]
                  ],[
                     'category_id' => 74,
                     'sub_categories' => [
                        [
                           'category_id' => 80
                        ],[
                           'category_id' => 81
                        ],[
                           'category_id' => 82
                        ],[
                           'category_id' => 83
                        ]
                     ]
                  ],[
                     'category_id' => 75,
                     'sub_categories' => [
                        [
                           'category_id' => 84
                        ],
                        [
                           'category_id' => 85
                        ],
                        [
                           'category_id' => 86
                        ]
                     ]
                  ],[
                     'category_id' => 76,
                     'sub_categories' => [
                        [
                           'category_id' => 87
                        ],[
                           'category_id' => 88,
                           'sub_categories' => [
                              [
                                 'category_id' => 93
                              ],[
                                 'category_id' => 94
                              ],[
                                 'category_id' => 95
                              ]
                           ]
                        ],[
                           'category_id' => 89
                        ],[
                           'category_id' => 90
                        ],[
                           'category_id' => 91
                        ],[
                           'category_id' => 92
                        ]
                     ]
                  ],[
                     'category_id' => 77
                  ]
               ]
            ],[
               'category_id' => 49,
               'sub_categories' => [
                  [
                     'category_id' => 96
                  ],[
                     'category_id' => 97
                  ],[
                     'category_id' => 98
                  ],[
                     'category_id' => 99
                  ],[
                     'category_id' => 100
                  ],[
                     'category_id' => 135
                  ],[
                     'category_id' => 136
                  ],[
                     'category_id' => 138
                  ],[
                     'category_id' => 139
                  ],[
                     'category_id' => 140
                  ]
               ]
            ],[
               'category_id' => 134,
               'sub_categories' => [
                  [
                     'category_id' => 101,
                     'sub_categories' => [
                        [
                           'category_id' => 108
                        ],[
                           'category_id' => 109
                        ],[
                           'category_id' => 110
                        ]
                     ]
                  ],[
                     'category_id' => 102,
                     'sub_categories' => [
                        [
                           'category_id' => 111
                        ],[
                           'category_id' => 112
                        ],[
                           'category_id' => 113
                        ]
                     ]                     
                  ],[
                     'category_id' => 103,
                     'sub_categories' => [
                        [
                           'category_id' => 114
                        ],[
                           'category_id' => 115
                        ],[
                           'category_id' => 116
                        ],[
                           'category_id' => 117
                        ],[
                           'category_id' => 118
                        ]
                     ]
                  ],[
                     'category_id' => 104
                  ],[
                     'category_id' => 105
                  ],[
                     'category_id' => 106,
                     'sub_categories' => [
                        [
                           'category_id' => 119
                        ],[
                           'category_id' => 120
                        ],[
                           'category_id' => 121
                        ],[
                           'category_id' => 122
                        ],[
                           'category_id' => 123
                        ],[
                           'category_id' => 124
                        ],[
                           'category_id' => 125
                        ],[
                           'category_id' => 126
                        ],[
                           'category_id' => 127
                        ]
                     ]
                  ],[
                     'category_id' => 107
                  ]
               ]
            ],[
               'category_id' => 128,
               'sub_categories' => [
                  [
                     'category_id' => 129
                  ],[
                     'category_id' => 130
                  ],[
                     'category_id' => 131
                  ],[
                     'category_id' => 132
                  ],[
                     'category_id' => 133
                  ]
               ]
            ],[
               'category_id' => 134
            ],[
               'category_id' => 141,
               'sub_categories' => [
                  [
                     'category_id' => 142
                  ]
               ]
            ]

        ];

        $this->recursive($categories);
      }
}

我想递归地遍历每个“类别”(大型多维数组)并制作一个“地址”,这是该类别在类别层次结构中的来源,这是因为在我的网站上,一个类别可以属于许多其他类别。

这个种子类如果为多对多关系Category 的数据透视表有。

在数据透视表中,我有:

  • category_id - 整数
  • parent_category_id - 整数
  • 地址 - 字符串

所以一个例子可以是(代码中的数组也是如此):

  • 6
  • 3
  • “2-3-6”

所以“2-3-6”是该类别 6 的特定实例的层次结构中的完整“地址”。

那么如何递归读取我的类别数组并在我的数据透视表中为每个字段输入上述三个字段?

4

1 回答 1

0

我已经用下面的代码解决了这个问题。

我只保存一个外部数组来记住每次迭代的位置,然后在函数内部使用另一个数组填充 ids 对应的类别信息并内爆它的所有 slug,这就是我需要将数据透视表中的每个项目作为 slug 处理是唯一的,并且可以用作 SEO 原因的路由参数。

private function recursive($categories, $depth=0)
{
  foreach($categories as $category) {
    array_push($this->locationHolder, $category['category_id']);
    if($depth == 0){
      $parent_id = 1;
    } else {
      $parent_id = $this->locationHolder[$depth-1];
    }
    $address_array = [];         
    foreach($this->locationHolder as $id) {
      array_push($address_array, Category::find($id)->slug);
    }
    DB::table('category_category')->insert([
      'category_id' => $category['category_id'],
      'parent_id' => $parent_id,
      'address' => implode("_", $address_array)
    ]);         
    if(isset($category['sub_categories'])) {
      $this->recursive($category['sub_categories'], $depth + 1);
    } else {
      array_pop($this->locationHolder);
    }
  }
  array_pop($this->locationHolder);
}
于 2015-09-05T09:36:32.153 回答