Хорошо, в основном, я сформировал запрос mySQL, который возвращает набор данных, полностью отсортированный по моей структуре данных. Если бы я заявлял об этом, это выглядело бы примерно так:
$arr = array( array( 'name' => 'Root', 'depth' => 0 ), array( 'name' => 'Food', 'depth' => 0 ), array( 'name' => 'Fruit', 'depth' => 1 ), array( 'name' => 'Bannnanna', 'depth' => 2 ), array( 'name' => 'Apple', 'depth' => 2 ), array( 'name' => 'Bannnanna', 'depth' => 2 ), array( 'name' => 'Meat', 'depth' => 1 ), array( 'name' => 'Furniture', 'depth' => 0 ) );
То, что я хочу, заключается в том, чтобы передать этот $ arr в метод, чтобы потом получить многомерный массив.
Например, Фрукты были бы ребенком Пищи. И Бананана была бы ребенком Фрута. Мне нужно, чтобы ключи каждого «ребенка» были «страницами».
Массив, который я показал выше, может также возвращать другую информацию, такую как 'lft' и 'rgt'. У меня нет «parentId», но я могу изменить свою модель, если это необходимо, но я бы предпочел придерживаться модели Nested Set.
Следующий код предполагает, что порядок и глубина ваших значений верны. Обратите внимание, что он удаляет дубликаты с помощью клавиш.
header('Content-Type: text/plain'); $arr = array( array( 'name' => 'Root', 'depth' => 0 ), array( 'name' => 'Food', 'depth' => 0 ), array( 'name' => 'Fruit', 'depth' => 1 ), array( 'name' => 'Bannnanna', 'depth' => 2 ), array( 'name' => 'Apple', 'depth' => 2 ), array( 'name' => 'Bannnanna', 'depth' => 2 ), array( 'name' => 'Meat', 'depth' => 1 ), array( 'name' => 'Furniture', 'depth' => 0 ) ); function process( &$arr, &$prev_sub = null, $cur_depth = 0 ) { $cur_sub = array(); while( $line = current( $arr ) ) { if( $line['depth'] < $cur_depth ) { return $cur_sub; } elseif( $line['depth'] > $cur_depth ) { $prev_sub = process( $arr, $cur_sub, $cur_depth + 1 ); } else { $cur_sub[$line['name']] = $line['name']; $prev_sub =& $cur_sub[$line['name']]; next( $arr ); } } return $cur_sub; } $values = process( $arr ); print_r( $values );
Вывод:
Array ( [Root] => Root [Food] => Array ( [Fruit] => Array ( [Bannnanna] => Bannnanna [Apple] => Apple ) [Meat] => Meat ) [Furniture] => Furniture )
что-то вроде этого возможно
$arr = array( array( 'name' => 'Root', 'depth' => 0 ), array( 'name' => 'Food', 'depth' => 0 ), array( 'name' => 'Fruit', 'depth' => 1 ), array( 'name' => 'Bannnanna', 'depth' => 2 ), array( 'name' => 'Apple', 'depth' => 2 ), array( 'name' => 'Bannnanna', 'depth' => 2 ), array( 'name' => 'Meat', 'depth' => 1 ), array( 'name' => 'Furniture', 'depth' => 0 ) ); $p = array(array()); foreach($arr as $n => $a) { $d = $a['depth'] + 1; $p[$d - 1]['children'][] = &$arr[$n]; $p[$d] = &$arr[$n]; } print_r($p[0]);