Intereting Posts
Условно установленная форма отправить действие Калькулятор доставки WooCommerce (shipping-calculator.php) – Переопределение PHP – только почтовый индекс Как обновить xml-файл с помощью PHP? Проблема с кадрированием изображения из базы данных mysql с использованием PHP? Изображение отображается черным? Intl работает отлично с Symfony2 на WAMP, но показывает ошибку в функциональных тестах Codeigniter – редактирование формы (повторное заполнение) с помощью edit_unique Как получить доступ к индексу массива при использовании функции explode () в той же строке? Передача в 32-битное целое может привести к усечению PHP Propel? Почему dns_get_record не показывает CNAME, когда я ЗНАЮ, что они существуют? Обратный скошенный массив к многомерному Является ли это безопасным способом вставки данных формы в базу данных MySQL? Silex SwiftMailer не выполняет подключение SMTP после выполнения Как сделать даты синтаксиса strtotime в формате австралийского (т.е. Великобритании): dd / mm / yyyy? imap_open (): Не удалось открыть поток Как проверить расположение памяти переменной в php?

PHP Traversing Function, чтобы превратить один массив в вложенный массив с дочерними элементами – на основе родительского идентификатора

У меня есть массив, подобный этому:

Array ( Array ( [ID] => 1 [parentcat_ID] => 0 ), Array ( [ID] => 2 [parentcat_ID] => 0 ), Array ( [ID] => 6 [parentcat_ID] => 1 ), Array ( [ID] => 7 [parentcat_ID] => 1 ), Array ( [ID] => 8 [parentcat_ID] => 6 ), Array ( [ID] => 9 [parentcat_ID] => 1 ), Array ( [ID] => 13 [parentcat_ID] => 7 ), Array ( [ID] => 14 [parentcat_ID] => 8 ) ) 

Но мне нужна функция, чтобы рекурсивно помещать каждый элемент в массив «children» внутри соответствующего родительского массива. Таким образом, это выглядело бы следующим образом:

 Array ( Array ( [ID] => 1 [parentcat_ID] => 0 [children] => Array ( Array ( [ID] => 6 [parentcat_ID] => 1 [childen] => Array ( Array ( [ID] => 8 [parentcat_ID] => 6 [children] => Array ( Array ( [ID] => 14 [parentcat_ID] => 8 ) ) ) ) ), Array ( [ID] => 7 [parentcat_ID] => 1 [children] => Array( Array ( [ID] => 13 [parentcat_ID] => 7 ) ) ), Array ( [ID] => 9 [parentcat_ID] => 1 ) ) ) Array ( [ID] => 2 [parentcat_ID] => 0 ) ) 

Надеюсь это имеет смысл!

    Дайте это пройти (проверено в соответствии с php 5.2):

     $ inArray = массив (
         array ('ID' => '1', 'parentcat_ID' => '0'),
         array ('ID' => '2', 'parentcat_ID' => '0'),
         array ('ID' => '6', 'parentcat_ID' => '1'),  
         array ('ID' => '7', 'parentcat_ID' => '1'),
         array ('ID' => '8', 'parentcat_ID' => '6'),          
         array ('ID' => '9', 'parentcat_ID' => '1'),  
         array ('ID' => '13', 'parentcat_ID' => '7'),
         array ('ID' => '14', 'parentcat_ID' => '8'),     
     );
    
     функция makeParentChildRelations (& $ inArray, & $ outArray, $ currentParentId = 0) {
         if (! is_array ($ inArray)) {
             вернуть;
         }
    
         if (! is_array ($ outArray)) {
             вернуть;
         }
    
         foreach ($ inArray как $ key => $ tuple) {
             if ($ tuple ['parentcat_ID'] == $ currentParentId) {
                 $ tuple ['children'] = array ();
                 makeParentChildRelations ($ inArray, $ tuple ['children'], $ tuple ['ID']);
                 $ outArray [] = $ tuple;   
             }
         }
     }
    
     $ outArray = array ();
     makeParentChildRelations ($ inArray, $ outArray);
    
     print_r ($ outArray);
    

    Недавно я ответил на аналогичный вопрос. Вот оно. Надеюсь, он вам подходит. Если нет, сообщите мне, и я приспособию его к вашим спецификациям.

    РЕДАКТИРОВАТЬ
    Хорошо, вот скорректированная версия, которая должна соответствовать вашим потребностям.

     function generateMultiArray( array $flatArray ) { // initiate result array $multiArray = array(); // iterate $flatArray foreach( $flatArray as $item ) { // for convenience, initiate these vars $id = $item[ 'ID' ]; $parentId = $item[ 'parentcat_ID' ]; // initiate this item's children array; $item[ 'children' ] = array(); // if parent doesn't exist yet, initiate it along with an empty 'children' array if( !isset( $multiArray[ $parentId ] ) ) { $multiArray[ $parentId ] = array( 'children' => array() ); } // if this item is initiated already (as being a parent) merge it with the current item $multiArray[ $id ] = isset( $multiArray[ $id ] ) ? $multiArray[ $id ] + $item : $item; // add this item to the parents children collection by reference (for efficiency) $multiArray[ $parentId ][ 'children' ][ $id ] = &$multiArray[ $id ]; } return $multiArray; } 

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

    Таким образом, чтобы получить доступ к дочерним элементам с произвольным id n, вы должны:

     $multiArray = generateMultiArray( $yourFlatArray ); $children = $multiArray[ n ][ 'children' ]; // replace n with the id 

    EDIT 2
    Забыто для создания массива дочерних элементов для предметов, которые не являются родителями; добавлено. В противном случае это приведет к уведомлению при попытке получить к нему доступ:

     $multiArray = generateMultiArray( $yourFlatArray ); $children = $multiArray[ $someIdWithoutChildren ][ 'children' ];