Не могу разобраться нужно получить массив который бы парсил pach категорий под категорий и тог далее... Зарание глубина вложенности не известна поэтому хотел сделать через рекурсию но что то не получается. Входные данные в Функцию:
array(6) {
[0]=>
array(3) {
["id"]=>
string(2) "11"
["text"]=>
string(18) "Смартфоны"
["id_parent"]=>
string(1) "0"
}
[1]=>
array(3) {
["id"]=>
string(2) "12"
["text"]=>
string(5) "Aplle"
["id_parent"]=>
string(2) "11"
}
[2]=>
array(3) {
["id"]=>
string(2) "13"
["text"]=>
string(6) "Xiaomi"
["id_parent"]=>
string(2) "11"
}
[3]=>
array(3) {
["id"]=>
string(2) "14"
["text"]=>
string(6) "Huawei"
["id_parent"]=>
string(1) "0"
}
[4]=>
array(3) {
["id"]=>
string(2) "15"
["text"]=>
string(37) "Зарядные устройства"
["id_parent"]=>
string(1) "0"
}
[5]=>
array(3) {
["id"]=>
string(2) "16"
["text"]=>
string(8) "Шлак"
["id_parent"]=>
string(2) "12"
}
}
Сама функция
private static function recursive($data, $pid = 0, $path = "", $level = 0, $arr = []) {
foreach ($data as $row) { //перебираем строки
if ($row['id_parent'] == $pid) { //Начинаем со строк, pid которых передан в функцию, у нас это 0, т.е. корень сайта
//Собираем строку в ассоциативный массив
$_row['id'] = $row['id'];
$_row['text'] = $path . "/" . $row['text'];
$arr[] = $_row; //Прибавляем каждую строку к выходному массиву
//Строка обработана, теперь запустим эту же функцию для текущего uid, то есть
//пойдёт обратотка дочерней строки (у которой этот uid является pid-ом)
self::recursive($data, $row['id'], $_row['text'], $level + 1, $arr);
}
}
var_dump($arr);
}
на выходе получаю через var_dump
array(0) {
}
array(1) {
[0]=>
array(2) {
["id"]=>
string(2) "16"
["text"]=>
string(34) "/Смартфоны/Aplle/Шлак"
}
}
array(0) {
}
array(2) {
[0]=>
array(2) {
["id"]=>
string(2) "12"
["text"]=>
string(25) "/Смартфоны/Aplle"
}
[1]=>
array(2) {
["id"]=>
string(2) "13"
["text"]=>
string(26) "/Смартфоны/Xiaomi"
}
}
array(0) {
}
array(0) {
}
array(3) {
[0]=>
array(2) {
["id"]=>
string(2) "11"
["text"]=>
string(19) "/Смартфоны"
}
[1]=>
array(2) {
["id"]=>
string(2) "14"
["text"]=>
string(7) "/Huawei"
}
[2]=>
array(2) {
["id"]=>
string(2) "15"
["text"]=>
string(38) "/Зарядные устройства"
}
}
То есть судя из результата массив переопределяется и если вернуть return $arr то получим не все значения
В определении функции 5 аргументов. В вызове - 4. Вы массив $arr не передаёте в рекурсию - как могут в нём накапливаться данные.
А когда будете передавать, то его надо и возвращать из рекурсии как результат функции recursive(). А вардампить в том месте, откуда вы вызываете функцию в первый раз, вне её.
UPDATE:
Такой код работает
<?php
$data = array(
0 => array(
'id' => '11',
'text' => 'Смартфоны',
'id_parent' => '0',
),
1 => array(
'id' => '12',
'text' => 'Apple',
'id_parent' => '11',
),
2 =>
array(
'id' => '13',
'text' => 'Xiaomi',
'id_parent' => '11',
),
3 =>
array(
'id' => '14',
'text' => 'Huawei',
'id_parent' => '0',
),
4 =>
array(
'id' => '15',
'text' => 'Зарядные устройства',
'id_parent' => '0',
),
5 =>
array(
'id' => '16',
'text' => 'Шлак',
'id_parent' => '12',
),
);
function recursive( $data, $pid = 0, $path = '', $level = 0, $arr = [] ) {
foreach ( $data as $row ) { //перебираем строки
if ( $row['id_parent'] == $pid ) { //Начинаем со строк, pid которых передан в функцию, у нас это 0, т.е. корень сайта
//Собираем строку в ассоциативный массив
$_row['id'] = $row['id'];
$_row['text'] = $path . '/' . $row['text'];
$arr[] = $_row; //Прибавляем каждую строку к выходному массиву
//Строка обработана, теперь запустим эту же функцию для текущего uid, то есть
//пойдёт обратотка дочерней строки (у которой этот uid является pid-ом)
$arr = recursive( $data, $row['id'], $_row['text'], $level + 1, $arr );
}
}
return $arr;
}
var_dump( recursive( $data ) );
Результат:
array(6) {
[0]=>
array(2) {
["id"]=>
string(2) "11"
["text"]=>
string(19) "/Смартфоны"
}
[1]=>
array(2) {
["id"]=>
string(2) "12"
["text"]=>
string(25) "/Смартфоны/Apple"
}
[2]=>
array(2) {
["id"]=>
string(2) "16"
["text"]=>
string(34) "/Смартфоны/Apple/Шлак"
}
[3]=>
array(2) {
["id"]=>
string(2) "13"
["text"]=>
string(26) "/Смартфоны/Xiaomi"
}
[4]=>
array(2) {
["id"]=>
string(2) "14"
["text"]=>
string(7) "/Huawei"
}
[5]=>
array(2) {
["id"]=>
string(2) "15"
["text"]=>
string(38) "/Зарядные устройства"
}
}
Виртуальный выделенный сервер (VDS) становится отличным выбором
В консоли браузера выводиться ошибка 500 после загрузке файла:
Хотите улучшить этот вопрос? Переформулируйте вопрос, чтобы он соответствовал тематике «Stack Overflow на русском»