2011-06-20 58 views
3

我有一個多維陣列看起來像這樣在多維數組搜索一個鍵,然後改變值用PHP

[0] => Array 
    (
     [recordId] => 5 
     [leaf] => 1 
     [children] => Array 
      (
       [0] => Array 
        (
         [recordId] => 6 
         [leaf] => 1 
         [children] => Array 
          (
           [0] => Array 
            (
             [recordId] => 7 
             [leaf] => 1 
            ) 
          ) 
        ) 
       [1] => Array 
        (
         [recordId] => 8 
         [leaf] => 1 
         [children] => Array 
          (
           [0] => Array 
            (
             [recordId] => 9 
             [leaf] => 1 
            ) 
           [1] => Array 
            (
             [recordId] => 10 
             [leaf] => 1 
            ) 
          ) 
        ) 
      ) 
    ) 

每個節點都有一個「葉」鍵時,默認值爲TRUE,並且具有'兒童陣列,如果有更多的節點下來。

如果節點中包含'children'數組,則需要將'leaf'鍵值設置爲FALSE。這樣,只有最終節點具有leaf = TRUE指定。

我試過搜索,但找不到代碼來做我所需要的,我無法圍繞我認爲需要的遞歸函數進行包裹。

任何想法如何在PHP中完成此任務?

感謝您的幫助。

+0

請記住,'1'和'true'不是一回事。 – Halcyon

+0

此外,我會爭辯說,'葉'是從沒有任何孩子的節點派生的,也就是(在我看來)葉的定義(>它沒有任何孩子)。 – Halcyon

+0

@Frits:那麼一個空的'children'數組應該表示孩子還是不孩子? – hakre

回答

2

理論上這應該工作:

function findChild(&$array){ 
    foreach($array as &$arr){ 
      if(isset($arr['children'])){ 
        $arr['leaf'] = 0; //there are children 
        findChild($arr['children']); 
      } 
      else { 
        $arr['leaf'] = 1; //there are no children 
      } 
    } 
} 

這裏是一個工作演示:http://codepad.org/AnYiRpES

+0

請注意使用'&'將參數變成傳遞引用(所以它修改了原始數組)。 – Halcyon

+0

@FritsvanCampen - 我在一個工作演示中添加了 – Neal

+0

這正是我所需要的(好吧,我不得不扭轉1和0)。非常感謝你。 – Chris

3

其實很簡單:

function leafOrNotLeaf(array $array) { 
    foreach ($array as $key => $sub) { 
     if (isset($sub['children'])) { 
      $array[$key]['leaf'] = false; 
      $array[$key]['children'] = leafOrNotLeaf($sub['children']); 
     } 
    } 
    return $array; 
} 

$new_array = leafOrNotLeaf($array); 
3

走在實際$array

array_walk($array, $walker = function (&$node) use (&$walker) { 
    $node['leaf'] = (int) empty($node['children']) 
     OR array_walk($node['children'], $walker); 
}); 

也許有點神祕,所以你必須愛PHP。

+2

「有點神祕」?放下「位」:它是神祕的。無論如何爲創造力。 ;) – netcoder

+1

@netcoder好吧,讓我們放下*位*:'$ n ='array'; $ l ='leaf'; $ c ='children'; $ f = $ n。「_ walk」; $ f($ $ n,$ b = function(&$ m)use(&$ b,$ l,$ c,$ f)$ $ m [$ l] =(int)empty($ m [$ c])$ f ($ m [$ c],$ b);});';) – hakre