Восстановить массив из квартиры (где дочерние массивы хранят индекс родительского массива) в многомерном?

Я пытаюсь взять плоский массив и воссоздать его так, чтобы он был многомерным. Я изучал 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 ) ) ) ) 

Solutions Collecting From Web of "Восстановить массив из квартиры (где дочерние массивы хранят индекс родительского массива) в многомерном?"

Во-первых, вы показываете не многомерный массив, а массив объектов 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' ]; 

РЕДАКТИРОВАТЬ
Хорошо, я протестировал его сейчас, и, похоже, он отлично работает после добавления некоторых недостающих точек с запятой.

Хорошо, я делаю некоторые предположения здесь:

  • Каждый элемент имеет только 1 родительский элемент, поэтому массив parents будет иметь только 1 tid
  • Массив сортируется таким образом, чтобы дети появлялись только после их родителей
  • У elmenets верхнего уровня будет родительский = 0

Учитывая это, попробуйте этот код:

 $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]); }