Я пытаюсь взять плоский массив и воссоздать его так, чтобы он был многомерным. Я изучал array_combine и array_merge, но я не уверен, что любой из них даст мне то, на что я надеюсь …
Массив в текущей форме (и это просто упрощенный пример):
Array ( [0] => stdClass Object ( [tid] => 31 [name] => Safeway [parents] => Array ( [0] => 0 ) ) [1] => stdClass Object ( [tid] => 32 [name] => Dairy [parents] => Array ( [0] => 31 ) ) [2] => stdClass Object ( [tid] => 33 [name] => Milk [parents] => Array ( [0] => 32 ) ) )
Я пытаюсь создать многомерный массив, где каждый объект является подмассивом его родителя. Итак, в примере выше, я пытаюсь вывести:
Array ( [0] => stdClass Object ( [tid] => 31 [name] => Safeway [children] => Array ( [tid] => 32 [name] => Dairy [children] => Array ( [tid] => 33 [name] => Milk ) ) ) )
Во-первых, вы показываете не многомерный массив, а массив объектов StdClass.
Если с вами все в порядке, чтобы сделать их истинно массивами, тогда это может сделать это:
// initiate result array $multiArray = array(); // assume $items is your current array foreach( $items as $item ) { // cast StdClass to array $objToArray = (array) $item; // if this item is initiated already merge it with the current item $multiArray[ $objToArray[ 'tid' ] ] = isset( $multiArray[ $objToArray[ 'tid' ] ] ) ? $multiArray[ $objToArray[ 'tid' ] ] + $objToArray : $objToArray; foreach( $objToArray[ 'parents' ] as $parentId ) { // if parents don't exist yet, initiate them if( !isset( $multiArray[ $parentId ] ) ) { $multiArray[ $parentId ] = array( 'children' => array() ); } // add this item to the parents children collection by reference (for efficiency) $multiArray[ $parentId ][ 'children' ][ $objToArray[ 'tid' ] ] = &$multiArray[ $objToArray[ 'tid' ] ]; } }
С этим вы можете легко найти элементы по id:
$item = $multiArray[ $someId ];
И чтобы получить ребенка:
$child = $item[ 'children' ][ $someChildId ];
Или все дети:
$children = $item[ 'children' ];
РЕДАКТИРОВАТЬ
Хорошо, я протестировал его сейчас, и, похоже, он отлично работает после добавления некоторых недостающих точек с запятой.
Хорошо, я делаю некоторые предположения здесь:
parents
будет иметь только 1 tid Учитывая это, попробуйте этот код:
$original = array ( ... your original array ... ); $nested = array (); $n = count($original); for ($i = 0; $i < $n; ++$i) { $nested[$original[$i]->tid] = $original[$i]; $nested[$original[$i]->tid]->children = array (); } while ($n-- && $current = $original[$n]) if ($current->parents[0] != 0 && $current->parents[0] != $current->tid) { $nested[$current->parents[0]]->children[] = $current; unset ($nested[$current->tid]); }