2017-12-11 3 views
3

permission 값이 no 인 하위 배열을 제거하여 다차원 배열을 필터링하려고합니다.단일 값을 기반으로 다차원 배열에서 배열 제거

내 배열 :

$array = array(
    array(
     'name' => 'dashboard', 
     'permission' => 'yes' 
    ), 
    array(
     'name' => 'Purchase Orders', 
     'permission' => 'yes', 
     'dropdown' => array(
      array(
       'name' => 'View Complete', 
       'permission' => 'yes' 
      ), 
      array(
       'name' => 'New PO', 
       'permission' => 'no' 
      ) 
     ) 
    ), 
    array(
     'name' => 'dashboard', 
     'permission' => 'no' 
    ) 
); 

이 내 원하는 결과입니다 (permission=>'no'가 완전히 제거 된 모든 그룹을 통지) 콜백 기능 array_filter()를 사용

$array = array(
    array(
     'name' => 'dashboard', 
     'permission' => 'yes' 
    ), 
    array(
     'name' => 'Purchase Orders', 
     'permission' => 'yes', 
     'dropdown' => array(
      array(
       'name' => 'View Complete', 
       'permission' => 'yes' 
      ) 
     ) 
    ) 
); 

는 매우 간단하게이 작업을 수행 첫 번째 레벨이지만 모든 레벨에서이를 수행하는 간단한 솔루션을 찾을 수는 없습니다.

지금 내 솔루션은 각 키를 루핑하고 설정을 해제하지만 배열의 정확한 구조를 알아야하고 상당히 혼란 스럽다고 느낍니다.

+0

가 항상 최대 2 수준 깊은? – solarc

+2

요소가 [is_array] (http://php.net/manual/en/function.is-array.php)가있는 배열인지 확인하고 권한 값을 확인하십시오. 그렇게하면 구조가 얼마나 깊은 지 알 필요가 없습니다. – Hameed

답변

1

다음은 재귀가있는 메소드입니다. 설명을 돕기위한 몇 가지 인라인 주석이 있지만 기본 기능이 본질적으로 표현되지 않는다고 설명 할 내용은 많지 않습니다.

코드 : (Demo)

$array = array(
array(
    'name' => 'dashboard', 
    'permission' => 'yes' 
), 
array(
    'name' => 'Purchase Orders', 
    'permission' => 'yes', 
    'dropdown' => array(
     array(
      'name' => 'View Complete', 
      'permission' => 'yes' 
     ), 
     array(
      'name' => 'New PO', 
      'permission' => 'no' 
     ) 
    ) 
), 
array(
    'name' => 'dashboard', 
    'permission' => 'no' 
)); 

function recursive_filter($array){ 
    foreach($array as $k=>&$subarray){ // make modifiable by reference 
     if(isset($subarray['permission']) && $subarray['permission']=='no'){ // check that this element exists before trying to access it 
      unset($array[$k]); // remove subarray 
     }elseif(isset($subarray['dropdown'])){ // check that this element exists before trying to access it 
      $subarray['dropdown']=recursive_filter($subarray['dropdown']); // recurse 
     } 
    } 
    return $array; 
} 

var_export(recursive_filter($array)); 

출력 :

array (
    0 => 
    array (
    'name' => 'dashboard', 
    'permission' => 'yes', 
), 
    1 => 
    array (
    'name' => 'Purchase Orders', 
    'permission' => 'yes', 
    'dropdown' => 
    array (
     0 => 
     array (
     'name' => 'View Complete', 
     'permission' => 'yes', 
    ), 
    ), 
), 
) 
1

조금 복잡합니다. 이것은 배열이 여러분이 준 예제보다 더 깊어지지 않는 경우에만 작동합니다.

foreach($array as $key => $item) { 
    if(isset($item['permission']) && $item['permission'] == 'no') { 
     unset($array[$key]); 
    } 
    if(isset($item['dropdown'])) { 
     foreach($item['dropdown'] as $key2 => $item2) { 
      if(isset($item2['permission']) && $item2['permission'] == 'no') { 
       unset($array[$key]['dropdown'][$key2]); 
      } 
     } 
    } 
} 
관련 문제