Прежде всего, я использую 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 - целое число
- адрес - строка
Таким образом, пример может быть (это верно для массива в коде):
- 6
- 3
- "2-3-6"
так что «2-3-6» - это полный «адрес» в иерархии для конкретного экземпляра этой категории 6.
Итак, как мне рекурсивно прочитать мой массив категорий и ввести три поля, указанные выше, для каждого в моей сводной таблице?