2015-08-28 44 views
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_ID - 整數
  • parent_category_id - 整數
  • 地址 - 串

因此,一個示例可以是(這是真實的陣列在代碼中):

  • 「2-3-6」

所以 「2-3-6」 是它的全部該類別的特定實例在層次結構中的 「地址」 6.

那麼如何遞歸地讀取我的數組類型並在我的數據透視表中輸入上述三個字段?

回答

0

我已經用下面的代碼解決了這個問題。

我只是舉行一個外部數組記憶每次迭代的位置,然後與另一個數組內的函數填充ids對應的類別信息和implode所有它的slug這就是我需要解決的每個項目數據透視表作爲slug是唯一的,並且可以用作搜索引擎優化原因的路線參數。

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); 
} 
相關問題