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