2012-10-07 18 views
10

ich ein Array in PHP haben, die wie folgt aussieht:erstellen verschachtelte Liste von Multidimensional Array

array (
    [0] => array (
     [id] => 1 
     [title] => "Title 1" 
     [parent_id] => NULL 
     [depth] => 0 
    ) 
    [1] => array (
     [id] => 2 
     [title] => "Title 2" 
     [parent_id] => NULL 
     [depth] => 0 
    ) 
    [2] => array (
     [id] => 3 
     [title] => "Title 3" 
     [parent_id] => 2 
     [depth] => 1 
    ) 
    [3] => array (
     [id] => 4 
     [title] => "Title 4" 
     [parent_id] => 2 
     [depth] => 1 
    ) 
    [4] => array (
     [id] => 5 
     [title] => "Title 5" 
     [parent_id] => NULL 
     [depth] => 0 
    ) 
    [5] => array (
     [id] => 6 
     [title] => "Title 6" 
     [parent_id] => 4 
     [depth] => 2 
    ) 
) 

Was will ich tun Iterierte über dieses Array und erstellen Sie eine verschachtelte <ol> Liste von ihm. So sollte das Ergebnis wie folgt aussehen:

<ol> 
    <li>Title 1</li> // id = 1 
    <li>Title 2</li> // id = 2 
    <ol> 
     <li>Title 3</li> // id = 3 -> parent_id = 2 
     <li>Title 4</li> // id = 4 -> parent_id = 2 
     <ol> 
      <li>Title 6</li> // id = 6 -> parent_id = 4 
     </ol> 
    </ol> 
    <li>Title 5</li> // id = 5 
</ol> 

Ich habe versucht, einen Weg zu denken, wie ich dies getan zu bekommen. Aber bis jetzt ist jeder Versuch gescheitert ...

Jeder eine Idee, wie kann ich eine solche verschachtelte <ol> Liste aus einem Array wie das erstellen?

Bitte beachten Sie, dass ich keine Kontrolle über die angegebenen Daten habe. Ich mache einfach einen Aufruf an eine API und es gibt json-Daten zurück, die ich in ein Array umwandle. Und das Array sieht genauso aus wie das, das ich beschrieben habe.

+0

Auf der Oberfläche sieht es einfach aus, aber ich denke, dass Sie immer noch Informationen fehlen, um die beste Antwort für Ihre Situation zu erhalten. Erstens, wie hast du das Array bekommen? Ist es von einer Datenbank? Wäre es möglich, es anders zu speichern, oder stecken Sie so fest? Ist die Tiefe garantiert nicht (jetzt oder in Zukunft) mehr als 1 oder 2 oder werden Sie jemals eine unbestimmte Anzahl von Unterstufen planen? Wie oft werden die Kategorien hinzugefügt oder gelöscht? Ich würde vorschlagen, dass Sie http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/ nachsehen, da ein verschachteltes Modell mehr sein kann, was Sie brauchen. – Mike

Antwort

13

sollten Sie verwenden Rekursion:

Zuerst wird das Array in 'php' Syntax:

<?php 
$a=array (
    '0' => array (
     'id' => 1, 
     'title' => "Title 1", 
     'parent_id' => 'NULL', 
     'depth' => 0 
    ), 
    '1' => array (
     'id' => 2, 
     'title' => "Title 2", 
     'parent_id' => 'NULL', 
     'depth' => 0 
    ), 
    '2' => array (
     'id' => 3, 
     'title' => "Title 3", 
     'parent_id' => 2, 
     'depth' => 1 
    ), 
    '3' => array (
     'id' => 4, 
     'title' => "Title 4", 
     'parent_id' => 2, 
     'depth' => 1 
    ), 
    '4' => array (
     'id' => 5, 
     'title' => "Title 5", 
     'parent_id' => 'NULL', 
     'depth' => 0 
    ), 
    '5' => array (
     'id' => 6, 
     'title' => "Title 6", 
     'parent_id' => 4, 
     'depth' => 0 
    ) 
); 

Hier der Code:

$level = 'NULL'; 

function r($a, $level) { 
    $r = "<ol>"; 
    foreach ($a as $i) { 
     if ($i['parent_id'] == $level) { 
      $r = $r . "<li>" . $i['title'] . r($a, $i['id']) . "</li>"; 
     } 
    } 
    $r = $r . "</ol>"; 
    return $r; 
} 

print r($a, $level); 

?> 

Die Ergebnisse:

<ol><li>Title 1<ol></ol></li><li>Title 2<ol><li>Title 3<ol> 
</ol></li><li>Title 4<ol><li>Title 6<ol></ol></li></ol></li></ol></li><li>Title 5 
<ol></ol></li></ol> 
  1. Titel 1 \ n
    1. Titel 2 \ n
      1. Titel 3 \ n
        1. Titel 4 \ n
          1. Titel 6 \ n
        2. Titel 5 \ n

          nach dem Check AS SOLUTION EDITED

          leeren Blätter zu vermeiden:

          function r($a, $level) { 
              $r = '' ; 
              foreach ($a as $i) { 
               if ($i['parent_id'] == $level) { 
                $r = $r . "<li>" . $i['title'] . r($a, $i['id']) . "</li>"; 
               } 
              } 
              return ($r==''?'':"<ol>". $r . "</ol>"); 
          } 
          
          4

          Sie können versuchen, die folgende

          $array = array (
              "0" => array (
               "id" => 1, 
               "title" => "Title 1", 
               "parent_id" => NULL, 
               "depth" => 0 
              ), 
              "1" => array (
               "id" => 2, 
               "title" => "Title 2", 
               "parent_id" => NULL, 
               "depth" => 0 
              ), 
              "2" => array (
               "id" => 3, 
               "title" => "Title 3", 
               "parent_id" => 2, 
               "depth" => 1 
              ), 
              "3" => array (
               "id" => 4, 
               "title" => "Title 4", 
               "parent_id" => 2, 
               "depth" => 1 
              ), 
              "4" => array (
               "id" => 5, 
               "title" => "Title 5", 
               "parent_id" => NULL, 
               "depth" => 0 
              ), 
              "5" => array (
               "id" => 6, 
               "title" => "Title 6", 
               "parent_id" => 4, 
               "depth" => 0 
              ) 
          ); 
          
          echo(make($array)); 
          

          Ausgabe

          <ol> 
              <li>Title 1</li> 
              <li>Title 2</li> 
              <ol> 
               <li>Title 3</li> 
               <li>Title 4</li> 
               <ol> 
                <li>Title 6</li> 
               </ol> 
              </ol> 
              <li>Title 5</li> 
          </ol> 
          

          Funktion

          function make(array $array, $no = 0) { 
              $child = hasChildren($array, $no); 
              if (empty($child)) 
               return ""; 
              $content = "<ol>\n"; 
              foreach ($child as $value) { 
               $content .= sprintf("\t<li>%s</li>\n", $value['title']); 
               $content .= make($array, $value['id']); 
              } 
              $content .= "</ol>\n"; 
              return $content; 
          } 
          
          function hasChildren($array, $id) { 
              return array_filter($array, function ($var) use($id) { 
               return $var['parent_id'] == $id; 
              }); 
          } 
          

          See Live Demo

          +1

          große antwort danke. Kannst du mir sagen, wie wir maximale Tiefe einstellen können, wenn man annimmt, dass Array-Elemente keinen 'Tiefen'-Schlüssel haben (wie ich es nicht habe).Wir brauchen ein '$ level = 0;' und '$ max_level = 3 ', nehme ich an. Aber wie platziert man sie in Ihrer Funktion? –

          +0

          @Baba, Er macht einen schönen Platz. Ich hoffe, Sie müssten Zeit haben, dies zu überprüfen. –

          1

          Die folgende Anordnung:

          Array 
          (
              [0] => Content 
              [1] => Array 
               (
                [0] => International 
                [1] => Array 
                 (
                  [0] => Mexico 
                  [1] => Array 
                   (
                    [0] => Tamaulipas 
                   ) 
          
                  [2] => USA 
                 ) 
          
               ) 
          
          ) 
          

          Mit dieser Funktion:

          function r($element) { 
              foreach ($element as $value) { 
               if (!is_array($value)) { 
                echo "<li>"; 
                echo $value; 
               } else { 
                echo "<ul>"; 
                r($value); 
                echo "</li>"; 
                echo "</ul>"; 
               } 
              } 
          } 
          

          PHP-Code:

          echo "<ul>"; 
          r($array); 
          echo "</ul>"; 
          

          Versandkosten:

          Verwandte Themen