Я выстраиваю иерархию категорий.
Я использую рекурсивную функцию для построения дочерних родительских отношений. Это создает вложенный набор массивов для каждого дочернего элемента.
Я хочу сгладить этот вложенный массив до 1 уровня. Есть много способов полностью сгладить многомерный массив, но я хочу перестроить массив для JSON, сохраняя вместе идентификатор категории и название в массиве.
Я получаю такой вывод:
array(2) {
[0] => array(2) {
["id"] => int(223)
["name"] => string(12) "child of top"
["parent"] => int(222)
}
[1] => array(1) {
[0]=> array(2) {
[id] => int(224)
["name"] => string(21) "child of child of top"
["parent"] => int(222)
}
}
}
Но хотелось бы иметь:
array(2) {
[0] => array(2) {
["id"] => int(223)
["name"] => string(12) "child of top"
["parent"] => int(222)
}
[1] => array(2) {
["id"] => int(224)
["name"] => string(21) "child of child of top"
["parent"] => int(223)
}
}
Который затем я могу встроить в правильное дочернее родительское отношение.
Я впервые строю такую структуру, поэтому я немного сбит с толку, пытаясь правильно отформатировать вещи.
Какие-нибудь рекомендации по дальнейшему продвижению в этом направлении? Спасибо.
редактировать добавлена функция
function display_children($cat_id, $level) {
$mysqli = new mysqli(DB_HOST, DB_USER, DB_PASSWORD, DB_NAME) or die ("Error " . mysqli_error($conn));
$stmt = $mysqli->prepare("SELECT id, content, parent_id
FROM table
WHERE parent_id = ?
");
$stmt->bind_param("i", $cat_id);
$stmt->execute();
$result = $stmt->get_result();
$stmt->close();
while( $row = $result->fetch_assoc() ) {
$data_array[] = $row;
$data_array[] = display_children($row['id'], $level+1);
}
return $data_array;
}
больше информации Первого предложенного ответа нет, так как дети со всех уровней не возвращаются на родительские уровни.
parent: int(229)\n
recursion[0]: array(3) {\n [\"id\"]=>\n int(232)\n [\"content\"]=>\n string(7) \"level 4\"\n [\"parent_id\"]=>\n int(231)\n}\n
array(2) {\n [0]=>\n array(3) {\n [\"id\"]=>\n int(231)\n [\"content\"]=>\n string(7) \"level 3\"\n [\"parent_id\"]=>\n int(229)\n }\n
[1]=>\n array(3) {\n [\"id\"]=>\n int(232)\n [\"content\"]=>\n string(7) \"level 4\"\n [\"parent_id\"]=>\n int(231)\n }\n}\n
parent: int(228)\n
recursion[0]: array(3) {\n [\"id\"]=>\n int(231)\n [\"content\"]=>\n string(7) \"level 3\"\n [\"parent_id\"]=>\n int(229)\n}\n
array(2) {\n [0]=>\n array(3) {\n [\"id\"]=>\n int(229)\n [\"content\"]=>\n string(7) \"level 2\"\n [\"parent_id\"]=>\n int(228)\n }\n
[1]=>\n array(3) {\n [\"id\"]=>\n int(231)\n [\"content\"]=>\n string(7) \"level 3\"\n [\"parent_id\"]=>\n int(229)\n }\n}\n
parent: int(227)\n
recursion[0]: array(3) {\n [\"id\"]=>\n int(229)\n [\"content\"]=>\n string(7) \"level 2\"\n [\"parent_id\"]=>\n int(228)\n}\n
array(2) {\n [0]=>\n array(3) {\n [\"id\"]=>\n int(228)\n [\"content\"]=>\n string(7) \"level 1\"\n [\"parent_id\"]=>\n int(227)\n }\n
[1]=>\n array(3) {\n [\"id\"]=>\n int(229)\n [\"content\"]=>\n string(7) \"level 2\"\n [\"parent_id\"]=>\n int(228)\n }\n}\n
Окончательный вывод для JSON:
[{\"id\":228,\"content\":\"level 1\",\"parent_id\":227},{\"id\":229,\"content\":\"level 2\",\"parent_id\":228}]"
используя эту проверку в цикле:
if ( isset( $recursion[0] ) ){
$data_array[] = $recursion[0];
echo " parent: ";
var_dump($cat_id)
echo "recursion[0]: "
var_dump( $recursion[0], $data_array);
}
Думаю, у меня есть ответ:
if ( isset( $recursion[1] ) ){
$data_array = array_merge($recursion,$data_array);
} elseif ( isset( $recursion[0] ) ){
$data_array[] = $recursion[0];
}
Если в возвращаемом рекурсии возвращаемом значении больше 1, тогда в рекурсии возвращаются дочерние элементы дочерних элементов. Больше, чем просто ребенок текущего родителя. Требуется вернуть весь массив рекурсии. Затем объедините массив с текущим родителем. Я еще не тестировал это полностью, но, похоже, все идет хорошо.
Привет. Я добавил функцию fyi. Я пытался придумать способ избежать вложенного массива, но не смог туда добраться.
похоже, вам нужно условие, чтобы проверить, работаете ли вы с массивом с дочерними элементами или с «пустым» массивом, содержащим правильный элемент массива
Интересно, это может быть то, что мне нужно.






если структура является примером, это должно работать:
function display_children($cat_id, $level) {
$mysqli = new mysqli(DB_HOST, DB_USER, DB_PASSWORD, DB_NAME) or die ("Error " . mysqli_error($conn));
$stmt = $mysqli->prepare("SELECT id, content, parent_id
FROM table
WHERE parent_id = ?
");
$stmt->bind_param("i", $cat_id);
$stmt->execute();
$result = $stmt->get_result();
$stmt->close();
while( $row = $result->fetch_assoc() ) {
$data_array[] = $row;
$recursion = display_children($row['id'], $level+1);
if (isset($recursion['id']))
$data_array[] = $recursion;
elseif (isset($recursion[0]))
$data_array[] = $recursion[0];
else
//manage error
}
return $data_array;
}
Прекрасно, это имеет смысл, но мне трудно полностью сосредоточить внимание на рекурсивном процессе в целом. Вызов самого себя и возвращение значения самому себе, и эта последняя небольшая часть необходима для изоляции процесса. Спасибо!
оказывается, я еще не совсем там. когда появляется больше детей, их игнорируют. Я добавил более полный вывод рекурсивного вызова var_dump ($ recusive);
Я действительно не понимаю вашу добавленную информацию, можете ли вы опубликовать исходный случай, ожидаемый результат и фактический (неправильный) результат?
Привет, я пытался это решить, я понимаю, что первая проверка рекурсии не нужна, и проблема в том, что возврат не может пройти проверку рекурсии обратно через уровни рекурсии. Я изменил дополнительную информацию, чтобы отобразить запрашиваемого родителя и результаты рекурсии.
какую функцию вы использовали для добавления вложенного массива в родительский? Возможно, вам просто нужно заменить array_push ($ parent, $ child) на $ parent [] = $ child