Сглаживание многомерного массива 1 уровня PHPPhp

Кемеровские программисты php общаются здесь
Ответить
Anonymous
 Сглаживание многомерного массива 1 уровня PHP

Сообщение Anonymous »

Я строю иерархию категорий.

Я использую рекурсивную функцию для построения дочерних и родительских отношений. При этом для каждого дочернего элемента создается вложенный набор массивов.

Я хочу сгладить этот вложенный массив до 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 значения, то рекурсия возвращает дочерние элементы дочерних элементов. Больше, чем просто ребенок текущего родителя. Требуется вернуть весь рекурсивный массив. Затем объедините массив с текущим родителем. Я еще не проверял это тщательно, но, похоже, все идет хорошо.

Подробнее здесь: https://stackoverflow.com/questions/502 ... -level-php
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Php»