Сглаживание многомерного массива 1 уровень php

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

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

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

какую функцию вы использовали для добавления вложенного массива в родительский? Возможно, вам просто нужно заменить array_push ($ parent, $ child) на $ parent [] = $ child

Riccardo 07.05.2018 14:00

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

digitalcreative.tech 07.05.2018 14:17

похоже, вам нужно условие, чтобы проверить, работаете ли вы с массивом с дочерними элементами или с «пустым» массивом, содержащим правильный элемент массива

moped 07.05.2018 14:42

Интересно, это может быть то, что мне нужно.

digitalcreative.tech 07.05.2018 14:55
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
4
195
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

если структура является примером, это должно работать:

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;
    }

Прекрасно, это имеет смысл, но мне трудно полностью сосредоточить внимание на рекурсивном процессе в целом. Вызов самого себя и возвращение значения самому себе, и эта последняя небольшая часть необходима для изоляции процесса. Спасибо!

digitalcreative.tech 07.05.2018 23:33

оказывается, я еще не совсем там. когда появляется больше детей, их игнорируют. Я добавил более полный вывод рекурсивного вызова var_dump ($ recusive);

digitalcreative.tech 08.05.2018 00:17

Я действительно не понимаю вашу добавленную информацию, можете ли вы опубликовать исходный случай, ожидаемый результат и фактический (неправильный) результат?

Riccardo 08.05.2018 14:53

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

digitalcreative.tech 09.05.2018 12:09

Другие вопросы по теме