2011-08-02 21 views
1

給定一個數組:拼合嵌套層次PHP數組轉換成字符串表示

0 => (
    [parent_id] => null, 
    [name] => "Root" 
    [children] => array(
     10 => array(
      [parent_id] => 0, 
      [name] => "Category A", 
      [children] => array(
       30 => array(
        [parent_id] => 10, 
        [name] => "Category C" 
       ) 
      ) 
     ), 
     20 => array(
      [parent_id] => 0, 
      [name] => "Category B" 
     ) 
    ) 
) 

我需要回到這些路徑的字符串表示的數組...

array(
    [0] => "Root", 
    [10] => "Root > Category A", 
    [30] => "Root > Category A > Category C", 
    [20] => "Root > Category B" 
) 

我已經搞亂圍繞這樣做遞歸,但我有一些麻煩,有效地這樣做。有沒有簡單的方法做到這一點,我只是俯瞰?

編輯:

解決方案就是亞歷山大Varwijk的回答稍微修改後的版本。一些調整,以處理不存在的孩子,通過功能不變,所以很容易改變函數名和從array_merge到+運營商更改了陣列,以保持組合鍵調用函數遞歸。

function flatten($data, $prefix = "", $item_seperator = "/") { 
    $seperator = $prefix == "" ? "" : $item_seperator; 
    $return = array(); 
    if (is_array($data)) { 
     foreach($data as $key => $value) { 
      $return[$value["endeca_id"]] = $prefix . $seperator . $value["url_key"]; 
      if(array_key_exists("children", $value)) 
      { 
       $return = $return + call_user_func(__FUNCTION__, $value["children"], $prefix . $seperator . $value["url_key"], $item_seperator); 
      } 
     } 
    } 
    return $return; 
} 
+2

我會說遞歸它是去這裏的路。謹慎地展示你最好的嘗試呢? – Wrikken

回答

0

我喜歡這個挑戰,這應該這樣做:

<?php 
$start = array(
    0 => array(
     'parent_id' => null, 
     'name' => "Root", 
     'children' => array(
      10 => array(
       'parent_id' => 0, 
       'name' => "Category A", 
       'children' => array(
        30 => array(
         'parent_id' => 10, 
         'name' => "Category C" 
        ) 
       ) 
      ), 
      20 => array(
       'parent_id' => 0, 
       'name' => "Category B" 
      ) 
     ) 
    ) 
); 

function recurse($data, $prefix = '') { 
    $seperator = ($prefix == '' ? '' : ' > '); 
    $return = array(); 
    if (is_array($data)) { 
     foreach($data as $key => $value) { 
      $return[$key] = $prefix . $seperator . $value['name']; 
      $return = array_merge($return, recurse($value['children'],$prefix . $seperator . $value['name'])); 
     } 
    } 

    return $return; 
} 

print_r(recurse($start)); 
?> 
+0

作品真的很好。只需要進行一個小的調整,以便在嘗試訪問它之前檢查它是否存在子節點... if(array_key_exists(「children」,$ value)) – wlvrn

0

只是回答前一個問題僅5分鐘與此類似這可能給你一個更好地瞭解你做什麼 previous answered

+0

我們正在處理JSON字符串,而不是SimpleXML的。問題其實涉及到編寫遞歸函數,可以處理的樹結構。 – wlvrn