Иерархический массив PHP – Родители и дети

Я использую PHP и mySQL с Idiorm . Это может быть не актуально.

Мой массив PHP

  • Это отношения между родителями и детьми.
  • 0 является родительским корнем.
  • Пример. Корневой родительский 0 имеет дочерний элемент 33, у которого есть дочерний элемент 27, у которого есть дочерний элемент 71.

Эта структура массива может быть изменена, если это необходимо для решения проблемы.

array ( 33 => array ( 0 => '27', 1 => '41', ), 27 => array ( 0 => '64', 1 => '71', ), 0 => array ( 0 => '28', 1 => '29', 2 => '33', ), ) 

Мой иерархический результат

Что-то вроде этого, но как массив …

  0 => 28 29 33 27 => 64 71 41 

Информация

  • Глубина не определена и может быть неограниченной. Я попробовал, но это может быть не так.

Мои собственные мысли

  • Некоторая рекурсивная функция?
  • Некоторые в то время как петли?

Я попробовал оба из вышеперечисленного, просто получил беспорядок. Это просто.

    Предложение от @deceze сработало. Однако входной массив должен изменить litte, вот так …

     $rows = array( array( 'id' => 33, 'parent_id' => 0, ), array( 'id' => 34, 'parent_id' => 0, ), array( 'id' => 27, 'parent_id' => 33, ), array( 'id' => 17, 'parent_id' => 27, ), ); 

    От https://stackoverflow.com/a/8587437/476 :

     function buildTree(array $elements, $parentId = 0) { $branch = array(); foreach ($elements as $element) { if ($element['parent_id'] == $parentId) { $children = buildTree($elements, $element['id']); if ($children) { $element['children'] = $children; } $branch[] = $element; } } return $branch; } $tree = buildTree($rows); print_r( $tree ); 

    Я добавил к ответам @Jens Törnell, чтобы определить параметры имени столбца parent_id, имени ключа дочернего массива, а также имени столбца для id.

     /** * function buildTree * @param array $elements * @param array $options['parent_id_column_name', 'children_key_name', 'id_column_name'] * @param int $parentId * @return array */ function buildTree(array $elements, $options = [ 'parent_id_column_name' => 'parent_id', 'children_key_name' => 'children', 'id_column_name' => 'id'], $parentId = 0) { $branch = array(); foreach ($elements as $element) { if ($element[$options['parent_id_column_name']] == $parentId) { $children = buildTree($elements, $options, $element[$options['id_column_name']]); if ($children) { $element[$options['children_key_name']] = $children; } $branch[] = $element; } } return $branch; } 

    Поскольку функциональность довольно универсальна , мне удалось использовать вышеупомянутую функцию в большинстве моих проектов.