2016-04-24 62 views
0

メニュー項目を含む配列が1つあります。各項目にはparent_idがあります。私は何時間も探していますが、再帰的に配列をどのようにトラバースするかを理解することはできません。私は再帰をうまく行っていない。メニュー配列を再帰的に作成

私は以下の投稿からコードを使用しようとしました。それはhtmlメニューを生成しますが、私は配列のカスタムHTMLメニューを作ることができるように配列も欲しいので、最初のレコードを見落とします。

Using recursion to build navigation

私は他のポストからこのコードを試みたが、それは空の配列を返します。

create_array(-1, $array); 

function create_array($number, $data) 
{ 
    $result = array(); 
    foreach ($data as $row) 
    { 
     if ($row['parent_id'] == $number) 
     { 
      $result[$row['id']] = create_array($row['id'], $data); 
     } 
    } 
    return $result; 
} 

データ配列:希望

Array 
(
    [0] => Array 
     (
      [id] => 1 
      [parent_id] => -1 
      [url] => /home 
     ) 

    [1] => Array 
     (
      [id] => 2 
      [parent_id] => 0 
      [url] => /page 
     ) 

    [2] => Array 
     (
      [id] => 3 
      [parent_id] => 2 
      [url] => /page/sub_page 
     ) 

    [3] => Array 
     (
      [id] => 4 
      [parent_id] => 3 
      [url] => /page/sub_page/inner_page/ 
     ) 

) 

結果:

home - page 
     sub_page 
      inner_page 

すべてのヘルプは非常にしてください理解されるであろう。

+0

@larsAnders実際、データは自己参照親IDを持つ単一のテーブルからです。 idが0の子要素は子要素ではなく、-1はホームページです。他の子は親IDとしてのidと対になります。 – Bsienn

+0

$ numberは正確に何ですか? – Adam

+0

@ null05ホームページの開始親エントリは-1です。その機能はうまく機能しませんでした。 – Bsienn

答えて

1

まず、0を親として印刷することから始めます。それぞれの子が子供であることがわかり、各子供のために再び開始します。

何かのように:ガブリエルへ

function menu($data,$parent=-1) { 
    $res='';  
    foreach($data as $e) { 
     if($e['parent_id']==$parent||($parent==-1&&$e['parent_id']==0)) { //Also search for 0 when parent is -1 as are both the roots 
      $res.='<li>'.$e['url']; //Or whatever you want to show 
      $sub=menu($data,$e['id']); 
      if($sub) $res.='<ul>'.$sub.'</ul>'; 
      $res.='</li>'; 
     } 
    } 
    return $res; 
} 

<ul><?=menu($data)?></ul> 
+0

ありがとう。これは素晴らしいです。私はこれを使用しますが、印刷する代わりに配列を返す方法を提供できますか?私はそれをする方法を理解していません。しかし、これは私の状況にとって非常にうまくいきます。 – Bsienn

+1

あなたが行ったのとまったく同じです。印刷の代わりに配列を取り込む。 – Gabriel

0

おかげで、私はメニューの配列を返す他のメソッドを作成するために彼の方法を使用しています。

$data = array(
    array('id'=>1, 'parent_id'=>-1, 'url_title'=>'home', 'url'=>'/home'), 
    array('id'=>2, 'parent_id'=>0, 'url_title'=>'page-one', 'url'=>'/page-one'), 
    array('id'=>3, 'parent_id'=>2, 'url_title'=>'sub-page', 'url'=>'/sub-page'), 
    array('id'=>4, 'parent_id'=>3, 'url_title'=>'inner-page', 'url'=>'/inner-page') 
    ); 


function menu_html($data,$parent=-1) { 
    $res=''; 
    foreach($data as $e) { 
     if($e['parent_id']==$parent||($parent==-1&&$e['parent_id']==0)) { 
      $res.='<li>'.$e['url']; 
      $sub=menu_html($data,$e['id']); 
      if($sub) $res.='<ul>'.$sub.'</ul>'; 
      $res.='</li>'; 
     } 
    } 
    return $res; 
} 

echo '<ul>'.menu_html($data).'</ul>'; 

function menu_array($data,$parent=-1) { 
    $res=array(); 
    foreach($data as $e) { 
     if($e['parent_id']==$parent||($parent==-1&&$e['parent_id']==0)) { 
      $res[$e['url']] = $e; 
      $sub=menu_array($data, $e['id']); 
      if($sub) $res[$e['url']]['sub-nav'] = $sub; 
     } 
    } 
    return $res; 
} 

echo "<pre>"; 
print_r(menu_array($data)); 
echo "</pre>"; 

出力:

/home 
    /page-one 
     /sub-page 
      /inner-page 

Array 
(
    [/home] => Array 
     (
      [id] => 1 
      [parent_id] => -1 
      [url_title] => home 
      [url] => /home 
     ) 

    [/page-one] => Array 
     (
      [id] => 2 
      [parent_id] => 0 
      [url_title] => page-one 
      [url] => /page-one 
      [sub-nav] => Array 
       (
        [/sub-page] => Array 
         (
          [id] => 3 
          [parent_id] => 2 
          [url_title] => sub-page 
          [url] => /sub-page 
          [sub-nav] => Array 
           (
            [inner-page] => Array 
             (
              [id] => 4 
              [parent_id] => 3 
              [url_title] => inner-page 
              [url] => inner-page 
             ) 

           ) 

         ) 

       ) 

     ) 

) 
関連する問題