Intereting Posts
Загрузка изображения события facebook вызывает ошибку Сортировка массива с использованием нескольких критериев в PHP Загрузите новую страницу напрямую, если пользователь уже зарегистрировался в facebook CMS на основе CodeIgniter PHP устанавливает тайм-аут для скрипта с системным вызовом, set_time_limit не работает Прикрепить JQuery Autocomplete к текстовому полю, которое загружается вызовом Ajax Проблемы с памятью dompdf Есть ли стандартный способ поменять запрос из идентификатора на другой столбец, например «имя»? Использование PHP spl_autoload_register () с помощью Codeigniter Подключение к FTPS с использованием PHP и сертификата как auth Поиск рекурсивно пустых папок и их рекурсивное удаление PHP читает подкаталоги и просматривает файлы как? Очистить содержимое веб-страницы Тот же контроллер ресурсов Laravel для нескольких маршрутов Как получить долготу и широту любого адреса?

PHP> Формировать многомерный массив из плоского массива вложенных множеств

Хорошо, в основном, я сформировал запрос 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]);