У меня есть массив, подобный этому:
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' ];