2013-11-20 47 views
0

我一直在這個問題上停留了一段時間,現在決定轉向偉大的stackoverlow社區尋求建議。我要求解決我的問題,但在瞭解解決方案時我會學到很多。嵌套子數組中的選定值,需要父數組以獲取值

我有一個數組作爲這裏

Array 
(
    [0] => Array 
     (
      [id] => 1 
      [parent] => 0 
     ) 

    [1] => Array 
     (
      [id] => 2 
      [parent] => 0 
     ) 

    [2] => Array 
     (
      [id] => 3 
      [parent] => 0 
      [children] => Array 
       (
        [0] => Array 
         (
          [id] => 4 
          [parent] => 3 
          [children] => Array 
           (
            [0] => Array 
             (
              [id] => 7 
              [parent] => 4 
              [selected] => 1 
             ) 

           ) 

         ) 

        [1] => Array 
         (
          [id] => 5 
          [parent] => 3 
         ) 

        [2] => Array 
         (
          [id] => 6 
          [parent] => 3 
         ) 

       ) 

     ) 
) 

看到正如你可以看到數組元素有時有嵌套的「孩子」,而那些可能有「孩子」等等等等,但最終你會來到一個數組值「SELECTED」= true。我需要的是讓所有父母都成爲「選擇」的方式。

我在PHP中有這個功能,但它拒絕工作。現在我的大腦被炸

private function selectParent($tree) 
{ 
    foreach ($tree as $key => $branch) 
    { 
     if(isset($branch['children'])) 
     { 
      $tree[$key]['children'] = self::selectParent($tree[$key]['children']); 
     } 

     if(isset($branch['children'])) 
     { 
      foreach ($branch['children'] as $child) 
      { 
       if(isset($child['selected'])) 
       { 
        $tree[$key]['selected'] = true; 
       } 
      } 
     } 
    } 
    return $tree; 
} 

任何幫助/技巧/解決方案非常讚賞。

感謝 馬丁

UPDATE

我我的功能更新,這和它的作品

private function selectParent($tree, $id = null) 
{ 
    $newTree = array(); 

    foreach ($tree as $key => $branch) 
    { 
     if(isset($branch['children'])) 
     { 
      $branch['children'] = self::selectParent($branch['children']); 
     } 

     if(isset($branch['children'])) 
     { 
      foreach ($branch['children'] as $child) 
      { 
       if(isset($child['selected'])) 
       { 
        $branch['selected'] = true; 
       } 
      } 
     } 

     $newTree[] = $branch; 
    } 
    return $newTree; 
} 

我會然而考慮建議的方法。 謝謝那些回覆幫助的人!

+0

請原諒我的代碼塊 –

+0

失敗的嘗試就在我編輯它的管理做了我。對不起,謝謝! –

+0

我非常懷疑它*「拒絕工作」* – AbraCadaver

回答

1

這顯然是一個遞歸任務。請嘗試以下操作:

$data = [ 
    ['id' => 1, 'selected' => false, 'parent' => 0], 
    ['id' => 2, 'selected' => false, 'parent' => 0, 'children' => [ 
     ['id' => 3, 'selected' => false, 'parent' => 2], 
     ['id' => 4, 'selected' => false, 'parent' => 2, 'children' => [ 
      ['id' => 5, 'selected' => false, 'parent' => 4], 
      ['id' => 6, 'selected' => false, 'parent' => 4], 
      ['id' => 7, 'selected' => false, 'parent' => 4], 
     ]] 
    ]], 
    ['id' => 8, 'selected' => false, 'parent' => 0], 
]; 

function markSelectedBranch(&$data) { 
    $hasSelectedChildren = false; 

    foreach ($data as &$dataPoint) { 
     if (isset($dataPoint['children'])) { 
      $hasSelectedChildren = markSelectedBranch($dataPoint['children']); 
      if ($hasSelectedChildren) { 
       $dataPoint['selected'] = true; 
      } 
     } 

     if (isset($dataPoint['selected']) && $dataPoint['selected']) { 
      $hasSelectedChildren = true; 
     } 
    } 

    return $hasSelectedChildren; 
} 

var_dump(markSelectedBranch($data)); 
var_dump($data); 
+0

我承認我對遞歸的瞭解不多,所以會做我的研究。感謝您的建議!很多幫助! –

+0

在我的編輯中,這絕對是對我解決方案的改進。標記爲答案。 –

1

如果你是創建這個巨型複雜數組的人,我會建議使用OOP。您可以創建包含子項的對象。閱讀和調試會更容易。

下面是一個以OOP方式使用遞歸的例子。

PHP recursively traverse object tree

Example of using classes

parents, children, recursive list, and method structure

如果你堅持保留這個陣列結構,嘗試迴盪在你的代碼的變量,看看你的問題所在。

private function selectParent($tree) 
{ 
    foreach ($tree as $key => $branch) 
    { 

     if(isset($branch['children'])) 
     { 
      print_r($branch['children']); 
      $tree[$key]['children'] = self::selectParent($tree[$key]['children']); 
     } 

     if(isset($branch['children'])) 
     { 
      print_r($branch['children']); 
      foreach ($branch['children'] as $child) 
      { 
       print_r($child); 
       if(isset($child['selected'])) 
       { 
        print_r($child['selected']); 
        $tree[$key]['selected'] = true; 
       } 
      } 
     } 
    } 
    return $tree; 
} 
+0

謝謝您的建議。我會仔細看看的。 –

+0

真的很感謝你的幫助鮎魚。 –

+0

添加了第三個鏈接,其中包含與您正在嘗試執行的操作類似的操作。 – Catfish