2016-09-26 61 views
1

我有一個多維關聯數組,其中每個節點可以有可變數目的子節點。每個子節點將在某個點以布爾節點結束。我想要做的就是讓所有的子節點都以false結束,父節點將從數組改變爲布爾假。摺疊多維關聯數組,因此如果所有子節點都爲假,節點將轉換爲假

例輸入數組:

[ 
    [Agronomy] => [ 
     [blendingAnhydrous] => [ 
      [blendingSprayOrdersDeliveryTkts] => [ 
       [add] => true, 
       [create] => true, 
       [inquire] => true, 
       [delete] => true 
      ], 
      [historyInquiry] => [ 
       [add] => false, 
       [create] => true, 
       [inquire] => false, 
       [delete] => true 
      ], 
      [listAnhydrousTicketsToBeBilled] => [ 
       [add] => false, 
       [create] => false, 
       [inquire] => false, 
       [delete] => false 
      ], 
     ], 
     [main] => [ 
      [agronomyBlendingAnhydrousEntry]: false, 
      [agronomyRecomendationsHistory]: false, 
      [agronomyReports]: false, 
      [agronomySetup]: false 
     ], 
    ], 
    [Grain] => [ 
     [main] => [ 
      [option1] => false, 
      [option2] => false, 
      [option3] => false, 
     ] 
    ] 
] 

所需的輸出數組:

[ 
    [Agronomy] => [ 
     [blendingAnhydrous] => [ 
      [blendingSprayOrdersDeliveryTkts] => [ 
       [add] => true, 
       [create] => true, 
       [inquire] => true, 
       [delete] => true 
      ], 
      [historyInquiry] => [ 
       [add] => false, 
       [create] => true, 
       [inquire] => false, 
       [delete] => true 
      ], 
      [listAnhydrousTicketsToBeBilled] => false 
     ], 
     [main] => false 
    ], 
    [Grain] => false 
] 

代碼到目前爲止,我已經試過:

function collapseAuthorities(&$complexArray) 
{ 
    $keepExpanded = false; 
    foreach ($complexArray as $node => $value) { 
     if (is_array($value)) { 
      $this->collapseAuthorities($value); 
      if (!$keepExpanded) { 
       $value = false; 
      } 
     } elseif ($value === true) { 
      $keepExpanded = true; 
     } 
    } 
} 

我已經通過大量的做題了關於多維數組,但還沒有發現任何可以完全解決這種情況的東西。

回答

0

您需要遞歸掃描$值:

$rewriteArray = array(); 
foreach($mainParentArray as $key=>$value) { 

    $rewriteArray[$key] = decompose($value); 

} 

function decompose($value) { 
    if (is_array($value)) { 
     list($array_as_value, $false_found) = keyScan($value); 
     if ($array_as_value) { 
      dendriticReconstruct($value); 
     } else { 
      $return = $false_found ? false : $value; 
     } 
    } else { 
     $return = $value; 
    } 
    return $return; 
} 

function keyScan($value) { 
    $array_as_value = $false_found = false; 
    foreach($value as $k=>$v) { 
     if (is_array($v)) { 
      $array_as_value = true; 
      break; 
     } else { 
      if ($v === false) { 
       $false_found = true; 
       break; 
      } 
     } 
    } 
    return array($array_as_value, $false_found); 
} 

function dendriticReconstruct($value) { 

    //use method found at this post ---> http://stackoverflow.com/questions/2504685/php-find-parent-key-of-array 

} 

我不能完全完成它 - 它是帶我太久。我希望這能讓你開始朝正確的方向發展!

+0

這是更接近,但它崩潰[農學],即使它有一個真正的孩子節點。我得到了這個:'[[農學] =>錯誤,[糧食] =>虛假]'而不是上面所需的輸出。如果任何一個孩子是真的,那麼陣列節點需要保持擴展。只有當所有的孩子都是假的時候纔會崩潰 –

+0

將它摺疊爲單個假?在[農學] =>錯誤 –

+0

它摺疊爲'[[農學] =>假,[穀物] =>假]' –

相關問題