2012-10-07 33 views
10

からネストされたリストを作成し、私はこのようになりますPHPの配列、している:私は何をしたいが、このアレイの上多次元配列

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 
    ) 
) 

を反復され、そこからネストされた<ol>リストを作成します。結果は次のようになります:

<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> 

私はこれをどうやって達成できるかを考えようとしています。しかし、今までのすべての試みは失敗しました...

誰も私がどのようにそのような配列からそのようなネストされた<ol>リストを作成することができますか?

私は与えられたデータを管理していませんのでご注意ください。私は単にAPIを呼び出してjsonデータを返します。これは配列に変換されます。そして配列は、私が記述したものとまったく同じように見えます。

+0

それはシンプルに見えますが、私はあなたがまだあなたの状況に最良の答えを得るために情報を欠いていると思います。まず、どのように配列を取得しましたか?それはデータベースからですか?それを別に保管することは可能でしょうか、それともあなたはそのように邪魔されていますか?深さは(現在または将来)1または2以上でないことが保証されていますか、または不確定数のサブレベルを実行する予定ですか?カテゴリはどのくらいの頻度で追加または削除されますか?私はhttp://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/をチェックすることをお勧めします。ネストされたモデルは必要以上のものかもしれません。 – Mike

答えて

13

あなたは再帰を使用する必要があります。

「PHPの構文で最初の配列:

<?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 
    ) 
); 

ここコード

$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); 

?> 

結果

<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. タイトル1 \ n
    1. タイトル2 \ n
      1. タイトル3 \ n
        1. タイトル4 \ n
          1. タイトル6 \ n
        2. タイトル5 \ n

          は、空の葉を避けるためにSOLUTION

          AS CHECK後に編集:

          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

          あなたは

          を使用し、次の

          $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)); 
          

          出力

          <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> 
          

          機能を試すことができます

          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

          素晴らしい回答ありがとうございます。配列の要素に '深さ'キーがないと仮定して最大深度を設定する方法を教えてもらえますか?$ level = 0;と$ max_level = 3が必要です。しかしあなたの機能にそれらを置く方法はありますか? –

          +0

          @Baba、彼は素晴らしい場所を作る。あなたがこれを見直す時間があることを願っています。 –

          1

          以下の配列:この機能により

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

          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コード:

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

          戻り値:表面に

          <ul> 
              <li>Public</li> 
              <li>User</li> 
              <li>Content 
               <ul> 
                <li>International 
                 <ul> 
                  <li>Mexico 
                   <ul> 
                    <li>Tamaulipas</li> 
                   </ul> 
                  </li> 
                  <li>USA</li> 
                 </ul> 
                </li> 
               </ul> 
              </li> 
          </ul>