2011-12-28 90 views
4

孩子我有數組是這樣的:讓所有的深層多維數組

array(
    array(
     'id' => 1, 
     'children' => array(
      array(
       'id' => 2, 
       'parent_id' => 1 
      ), 
      array(
       'id' => 3, 
       'parent_id' => 1, 
       'children' => array(
        array(
         'id' => 4, 
         'parent_id' => 3 
        ) 
       ) 
      ) 
     ) 
    ) 
); 

數組去,如果有必要更深。我需要讓任何特定ID的孩子。

謝謝。

回答

7
function getChildrenOf($ary, $id) 
{ 
    foreach ($ary as $el) 
    { 
    if ($el['id'] == $id) 
     return $el; 
    } 
    return FALSE; // use false to flag no result. 
} 

$children = getChildrenOf($myArray, 1); // $myArray is the array you provided. 

除非我失去了一些東西,遍歷數組尋找的東西的id鍵,你正在尋找的ID匹配了(然後返回它的結果)。您也可以反覆搜索(並給我一個第二張貼的代碼,這將檢查parentId鍵代替)...

-

遞歸版本,包括子元素:

function getChildrenFor($ary, $id) 
{ 
    $results = array(); 

    foreach ($ary as $el) 
    { 
    if ($el['parent_id'] == $id) 
    { 
     $results[] = $el; 
    } 
    if (count($el['children']) > 0 && ($children = getChildrenFor($el['children'], $id)) !== FALSE) 
    { 
     $results = array_merge($results, $children); 
    } 
    } 

    return count($results) > 0 ? $results : FALSE; 
} 

遞歸版本,不包括子元素

function getChildrenFor($ary, $id) 
{ 
    $results = array(); 

    foreach ($ary as $el) 
    { 
    if ($el['parent_id'] == $id) 
    { 
     $copy = $el; 
     unset($copy['children']); // remove child elements 
     $results[] = $copy; 
    } 
    if (count($el['children']) > 0 && ($children = getChildrenFor($el['children'], $id)) !== FALSE) 
    { 
     $results = array_merge($results, $children); 
    } 
    } 

    return count($results) > 0 ? $results : FALSE; 
} 
+0

它需要遞歸作爲數組可以更深 – 2011-12-28 13:49:57

+0

它的工作只有頂級的元素,不適合兒童。 – cnkt 2011-12-28 13:50:11

+0

@Topener:問題在答案中改變了,所以我正在修復以適應。 - cnkt:在這工作,給我一分鐘左右。 – 2011-12-28 13:51:38

0
function array_searchRecursive($needle, $haystack, $strict=false, $path=array()) 
{ 
    if(!is_array($haystack)) { 
     return false; 
    } 

    foreach($haystack as $key => $val) { 
     if(is_array($val) && $subPath = array_searchRecursive($needle, $val,  $strict, $path)) { 
      $path = array_merge($path, array($key), $subPath); 
      return $path; 
     } elseif((!$strict && $val == $needle) || ($strict && $val['id'] === $needle)) { 
      $path[] = $key; 
      return $path; 
     } 
    } 
    return false; 
} 

array_searchRecursive(5, $arr); 

- 參考:http://greengaloshes.cc/2007/04/recursive-multidimensional-array-search-in-php/

+0

你能幫我嗎與此https://stackoverflow.com/questions/44804322/php-search-nested-array-of-array-and-return-only-matching-elements – Valay 2017-06-29 13:57:12

1

甲幼稚的方法將是由直到節點發現遍歷樹從根開始做一個詳盡search on the tree。在最壞的情況下,你必須遍歷整棵樹,只記下你正在尋找的節點是最後一個節點,甚至不存在。

更好的方法是最初構建一個將ID映射到樹內節點上的索引。有了這個,你只需要遍歷整個樹,然後通過索引直接訪問節點。理想情況下,索引將在樹形結構由平面數據構建時完成。

所以,如果你有一個平坦的陣列像your other question,你可以從它與平面陣列的只是一個迭代建樹和指數雙雙:

// array to build the final hierarchy 
$tree = array(
    'children' => array() 
); 

// index array that references the inserted nodes 
$index = array(0=>&$tree); 

foreach ($arr as $key => $val) { 
    // pick the parent node inside the tree by using the index 
    $parent = &$index[$val['parent_id']]; 
    // append node to be inserted to the children array 
    $node = $val; 
    $parent['children'][$val['id']] = $node; 
    // insert/update reference to recently inserted node inside the tree 
    $index[$val['id']] = &$parent['children'][$val['id']]; 
} 

此代碼是從my answer to a similar question拍攝。您發佈的最終陣列位於$tree['children']。其中的每個節點都可以通過$index[12345]進行訪問。

0

可以在代碼中使用建立該

$iter = new RecursiveIteratorIterator(new RecursiveArrayIterator($array), RecursiveIteratorIterator::SELF_FIRST); 
foreach ($iter as $val) { 
    if (isset($val['id']) && $val['id'] === 3) { 
     print_r($val['children']); 
     break; 
    } 
}