2017-01-12 17 views
0

は、この配列を考える:配列内の子アイテムへのパスを追加するにはどうすればよいですか?

$menu_items = array(
    array(
     'key' => 'aaa', 
     'children' => array(
      array(
       'key' => 'www' 
      ), 
      array(
       'key' => 'xxx' 
      ), 
     ) 
    ), 
    array(
     'key' => 'bbb', 
     'children' => array(
      array(
       'key' => 'yyy' 
      ), 
      array(
       'key' => 'zzz' 
      ), 
     ) 
    ), 
); 

私はこのような配列内の各ノードへのパスを追加したいと思います:

$menu_items = array(
      array(
       'key' => 'aaa', 
       'path' => 'aaa', 
       'children' => array(
        array(
         'key' => 'www', 
         'path' => 'aaa/www' 
        ), 
        array(
         'key' => 'xxx', 
         'path' => 'aaa/xxx' 
        ), 
       ) 
      ), 
      array(
       'key' => 'bbb', 
       'path' => 'bbb', 
       'children' => array(
        array(
         'key' => 'yyy', 
         'path' => 'bbb/yyy', 
        ), 
        array(
         'key' => 'zzz', 
         'path' => 'bbb/zzz', 
        ), 
       ) 
      ), 
     ); 

このメニュー項目の配列は2つのレベルがありますが、それはより多くのレベルを持つことができます。私が試してみました何

function add_menu_item_path(&$menu_data, $path = '') { 

    foreach ($menu_data as &$menu_item) { 
     $path = $path . '/' . $menu_item['key']; 
     $menu_item['path'] = $path; 
     if (!empty($menu_item['children'])) { 
      add_menu_item_path($menu_item['children'], $path); 
     } 
    } 
} 

予想通りこれは動作しません、それはここで見ることができます: http://ideone.com/sHdhss

+3

これまでにどのようなアプローチを試みましたか? – miken32

+1

あなたが望む結果は有用ですが、これまでに試したコードも表示する必要があります。あなたが持っているものを私たちに教えてください! –

答えて

1

単純な再帰関数は、すべてあなたが必要です。それは、パスを追跡し、アイテムがアレイを移動する際に更新する。

$menu_items = [ 
    ["key"=>"aaa","children"=>[["key"=>"www"], ["key"=>"xxx"]]], 
    ["key"=>"bbb", "children"=>[["key"=>"yyy"], ["key"=>"zzz"]]] 
]; 

function add_path(&$menu, $path = "") { 
    if (!is_array($menu)) { 
     return false; 
    } 
    foreach ($menu as &$item) { 
     if (is_array($item) && array_key_exists("key", $item)) { 
      $item["path"] = trim("$path/$item[key]", "/"); 
     } 
     if (array_key_exists("children", $item) && is_array($item["children"])) { 
      add_path($item["children"], "$path/$item[key]"); 
     } 
    } 
} 

add_path($menu_items); 
print_r($menu_items); 

編集:あなたのコードを投稿したので、あなたが私が思いついたものにかなり近いことが分かります。あなたの問題は毎回パスに追加していたので、長くなっていました。$path = $path . '/' . $menu_item['key'];

関連する問題