Создание вложенного UL из плоского массива в PHP

Это массив, который был создан из файла JSON. Я хочу создать неупорядоченный вложенный список. Я видел много учебников, но они обычно работают только для простого (id, parent id, name) макета. Этот массив более сложный, чем тот, поэтому мои попытки не работают.

Это желаемый результат:

  • Стандарт I: учебная программа, планирование и оценка
    • Индикатор IA. Учебная программа и планирование
      • IA-1. Развитие детей и подростков
        • контент будет включен здесь
      • IA-2. Развитие детей и подростков
        • контент будет включен здесь
    • Дополнительные показатели здесь, связанные со стандартом I
  • Стандарт II: ….

Существует несколько родителей, и их идентификаторы разделяются полем *_id . Я включил дубликаты полей с разными именами, чтобы сравнить сравнение, основанное на примерах, которые я видел в Интернете, которые могли бы сделать что-то вроде $parentID == $id . Я искал способы превратить это в массив деревьев, чтобы упростить чтение, но столкнулся с подобными сложностями.

Итак, чтобы понять структуру ниже, вот ключ:

[top_id] = [standard] и совпадает с [top] для сравнения

[parent_id] = [indicators] и совпадает с [parent] для сравнения

[child_id] = [element] и совпадает с [parent] для сравнения

Остальные – это контент, связанный с элементом [element], который я могу получить, когда я получу свой список, созданный успешно.

  Array ( [0] => Array ( [top_id] => 1 [top] => 1 [parent_id] => 2 [parent] => 2 [child_id] => 5 [child] => 5 [standard] => Standard I: Curriculum, Planning, and Assessment [indicator] => Indicator IA. Curriculum & Planning [element] => IA-1. Child and Adolescent Development [Connections] => some content here [Effective Practice] => some content here [Proficient] => some content here [Suggested Artifacts] => some content here ) [1] => Array ( [top_id] => 1 [top] => 1 [parent_id] => 2 [parent] => 2 [child_id] => 6 [child] => 6 [standard] => Standard I: Curriculum, Planning, and Assessment [indicator] => Indicator IA. Curriculum & Planning [element] => IA-2. Child and Adolescent Development [Connections] => some content here [Effective Practice] => some content here [Proficient] => some content here [Suggested Artifacts] => some content here ) ) 

– ОБНОВЛЕНИЕ ПРИ ПРИМЕРЫ ПРИМЕРЫ –

 foreach ($nodes as $node => $v) { // id's $topID = $v['top_id']; $parentID = $v['parent_id']; $childID = $v['child_id']; $top = $v['top']; $parent = $v['parent']; $child = $v['child'];; // name values $standard = $v['standard']; $indicator= $v['indicator']; $element = $v['element']; $connections = $v['Connections']; $practice = $v['Effective Practice']; $proficient = $v['Proficient']; $artifacts = $v['Suggested Artifacts']; echo "<ul>"; foreach($standard as $value){ echo "<li>"; print $value; echo "<ul>"; foreach($indicator as $v){ echo "<li>"; print $v; echo "</li>"; } echo "</ul>"; echo "</li>"; } echo '</ul>'; } 

Также

  if ($node[$top][] == $topID[]){ echo "<li>"; print $standard; echo "<ul>"; if ($node[$parent][] == $parentID[]){ echo "<li>"; print $indicator; echo "</li>"; } echo "</ul>"; echo "</li>"; } 

Solutions Collecting From Web of "Создание вложенного UL из плоского массива в PHP"

Сначала я собирал данные и строил дерево, а затем печатал дерево. Некоторые примеры кода:

 foreach ($nodes as $item) { // gather the data in an assoc array indexed by id if ( !isset($data_by_id[ $item['top_id'] ])) { $data_by_id[ $item['top_id'] ] = array( 'name' => $item['standard'] ); } if ( !isset($data_by_id[ $item['parent_id'] ])) { $data_by_id[ $item['parent_id'] ] = array( 'name' => $item['indicator'] ); } if ( !isset($data_by_id[ $item['child_id'] ])) { $data_by_id[ $item['child_id'] ] = array( 'name' => $item['element'], 'contents' => array( $item['Connections'], $item['Effective Practice'], $item['Proficient'], $item['Suggested Artifacts']) ); } // construct the tree - I've made a simple three tier array $tree[ $item['top_id'] ][ $item['parent_id'] ][ $item['child_id'] ]++; } // go through the tree and print the info // this is a recursive function that can be used on arbitrarily deep trees function print_tree( $data, $arr ){ echo "<ul>\n"; // the tree is an associative array where $key is the ID of the node, // and $value is either an array of child nodes or an integer. foreach ($arr as $key => $value) { echo "<li>" . $data[$key]['name'] . "</li>\n"; if (isset($data[$key]['contents']) && is_array($data[$key]['contents'])) { echo '<ul>'; foreach ($data[$key]['contents'] as $leaf) { echo '<li>' . $leaf . "</li>\n"; } echo "</ul>\n"; } // if $value is an array, it is a set of child nodes--ie another tree. // we can pass that tree to our print_tree function. if (is_array($value)) { print_tree($data, $value); } } echo "</ul>\n"; } print_tree($data_by_id, $tree); 

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