Formatee mi cadena JSON en una lista ordenada en PHP

Estoy trabajando en un simple CMS para un proyecto de mascotas. Actualmente tengo una cadena JSON que contiene una lista de ID de página y ID de página principal para una estructura de menú.

Quiero convertir ahora esta cadena en una lista anidada o jerárquica (lista ordenada).

Intenté mirar por todos lados, pero parece que terminé con una gama demasiado compleja de subclases. Estoy luchando por encontrar una solución ligera adecuada en PHP.

Aquí está el JSON:

**[{"id":3,"children":[{"id":4,"children":[{"id":5}]}]},{"id":6},{"id":2},{"id":4}]** 

Aquí está el resultado deseado:

 
  1. 3
    1. 4
      1. 5
  2. 6
  3. 2
  4. 4

¿Hay algo incorporado en PHP que pueda simplificar este proceso? Alguien ha tenido alguna experiencia de esto antes?

Soy un novato en PHP y SE. A la espera de saber de ti.

Aquí está mi progreso actual (no está funcionando demasiado bien)

 
    children; echo "
  1. ".$page->id."
  2. "; foreach($subpages as $subpage){ echo "
  3. ".$subpage->id."
  4. "; } } ?>

Puede usar la recursión para profundizar en los datos. Si el valor actual es una matriz, entonces la recursión nuevamente. Considera este ejemplo:

 $json_string = '[{"id":3,"children":[{"id":4,"children":[{"id":5}]}]},{"id":6},{"id":2},{"id":4}]'; $array = json_decode($json_string, true); function build_list($array) { $list = '
    '; foreach($array as $key => $value) { foreach($value as $key => $index) { if(is_array($index)) { $list .= build_list($index); } else { $list .= "
  1. $index
  2. "; } } } $list .= '
'; return $list; } echo build_list($array);

Usando una función que puede pasar recursivamente a través de su JSON, puede obtener la funcionalidad que desee. Considere el siguiente código: (esto solo representa un atributo de id como listado, como muestra el código deseado)

 $json = '[{"id":3,"children":[{"id":4,"children":[{"id":5}]}]},{"id":6},{"id":2},{"id":4}]'; function createOLList($group) { $output = (is_array($group)) ? "
    " : ""; foreach($group as $attr => $item) { if(is_array($item) || is_object($item)) { $output .= createOLList($item); } else { if($attr == "id") { $output .= "
  1. $item
  2. "; } } } $output .= (is_array($group)) ? "
" : ""; return $output; } print(createOLList(json_decode($json)));

Esto producirá el siguiente resultado HTML.

 
  1. 3
  1. 4
  1. 5
  • 6
  • 2
  • 4
  • Lo que estás buscando se llama recursividad, lo que puede hacerse mediante una función que se llame a sí misma.

    Si resolvió una vez enumerar todos los nodos de la lista en una función, puede aplicar la misma función para todas las listas secundarias. Como entonces, esas listas de niños también harán lo mismo en sus hijos.

     call_user_func(function ($array, $id = 'id', $list = 'children') { $ul = function ($array) use (&$ul, $id, $list) { echo '
      ', !array_map(function ($child) use ($ul, $id, $list) { echo '
    • ', $child[$id], isset($child[$list]) && $ul($child[$list]) , '
    • '; }, $array), '
    '; }; $ul($array); }, json_decode('[{"id":3,"children":[{"id":4,"children":[{"id":5}]}]},{"id":6}, {"id":2},{"id":4}]', TRUE));

    Como muestra este ejemplo, la función $ul se llama recursivamente sobre la lista y todos los elementos secundarios. Existen otras soluciones, pero la mayoría de las veces la recursión es un método simple aquí para hacer el trabajo una vez que lo ha entendido.

    Demostración: https://eval.in/153471 ; Salida (embellecida):

     
    • 3
      • 4
        • 5
    • 6
    • 2
    • 4
     < ?php $json_array = array(); array_push($json_array, array( 'id' => 3, 'children' => array( 'id' => 4, 'children' => array( 'id' => 5, ) ) )); array_push($json_array, array('id' => 6)); array_push($json_array, array('id' => 2)); array_push($json_array, array('id' => 4)); //your json object $json_object = json_encode($json_array); //echo $json_object; //here is where you decode your json object $json_object_decoded = json_decode($json_object,true); //for debug to see how your decoded json object looks as an array /* echo "
    "; print_r($json_object_decoded); echo "

    "; */ echo "

      "; foreach($json_object_decoded as $node){ if(isset($node['id'])){ echo "

    1. " . $node['id']; if(isset($node['children'])){ echo "
        "; echo "

      1. " . $node['children']['id'] . "
      2. "; if(isset($node['children'])){ echo "

        "; echo "

      1. " . $node['children']['children']['id'] . "
      2. "; echo "

      "; } echo "

    "; } echo ""; } } echo ""; ?>