1

배열 수가 미확인 배열을 재귀 적으로 (n 레벨 깊이) 포함합니다. 각 배열에는 name 키가 포함될 수 있습니다. 그 값들의 유일한 목록을 만들고 싶습니다.깊은 배열의 임의의 위치에있는 특정 키의 고유 한 값 목록을 만듭니다.

예 어레이가한다고 가정

$bigArray = array(
    'name'=>'one', 
    'something'=>array(
     'name'=>'two', 
     'subthing'=>array('name'=>'three') 
    ), 
    'anotherthing'=>array('name'=>'one') 
); 

예상되는 결과가 될 것이다 :

$uniques = array('one', 'two', 'three') // All the 'name' keys values and without duplicates. 

여기 fiddle of my attempt이다.

내 접근 방식은 그 값을 업데이트하는 기능을 참조로 $uniques 배열을 전달 array_walk_recursive을 사용하고 허용했다 :

$uniques = array(); 

function singleOut($item, $key, &$uniques) { 
    if ($key == 'name' && !in_array($itm,$uniques,true)) 
     $uniques[] = $item; 
} 

array_walk_recursive($bigArray, 'singleOut', $uniques); 

그러나, 그것은 나를 위해 작동하지 않습니다.

답변

0

array_unique도 사용할 수 있습니다. 예 :

+0

이 질문의 범위를 들어, 느슨한 비교가 잘됩니다.그러나이 링크를 방문하여 '0'일 수도있는 키에 대한 느슨한 비교를 사용할 때 예기치 않은 결과 (PHP 유형의 저글링 덕분에)를 볼 수 있습니다. [느슨한 비교를하면서 저글링을하면 원치 않는 결과가 발생합니다.] (https://stackoverflow.com/questions/44426990/type-juggling-while-making-loose-comparison-yields-unwanted-result)] – mickmackusa

0

사용자의 매개 변수가 동일한 수준의 재귀 내에서만 참조로 제공된다는 문제가 거의 발생했습니다. 당신은 참조하여 간접를 사용해야합니다 :

$bigArray = array(
    'name'=>'one', 
    'something'=>array(
     'name'=>'two', 
     'subthing'=>array('name'=>'three') 
    ), 
    'anotherthing'=>array('name'=>'one') 
); 

function singleOut($item, $key, $indirect) { 
    $uniques=&$indirect[0]; 
    if ($key == 'name' && !in_array($item,$uniques,true)) $uniques[] = $item; 

} 

$uniques = array(); 
$indirect = array(&$uniques); 
array_walk_recursive($bigArray, 'singleOut', $indirect); 
print_r($uniques); 

편집 :

바이올린이 here

0

array_walk_recursive()의 내부에 in_array() 확인하고 방지하기 위해, 당신은 키로서 name 값을 저장할 수있다 출력 배열. 이렇게하면 이전의 동일한 키를 덮어 쓰면 중복을 효과적으로 제거 할 수 있습니다. array_walk_recursive()이 완료되면 array_keys()을 사용하여 키에서 값으로 데이터를 이동할 수 있습니다.

코드 : (Demo)

$bigArray=[ 
    'name'=>'one', 
    'something'=>[ 
     'name'=>'two', 
     'subthing'=>['name'=>'three'] 
    ], 
    'anotherthing'=>['name'=>'one'] 
]; 
array_walk_recursive($bigArray,function($v,$k)use(&$uniques){ 
    if($k==='name') 
     $uniques[$v]=''; 
}); 
var_export(array_keys($uniques)); 

출력 :

array (
    0 => 'one', 
    1 => 'two', 
    2 => 'three', 
) 

array_unique() 때문에이 array_keys()는 일반적으로 빠른 수행해야 사용하여, 어떤 경우에는 속도가 느려질 수 있습니다. 즉, 마이크로 최적화가 중요하다면 실제 데이터와 특정 환경을 사용하여 벤치 마크 테스트를 수행하고 프로젝트에 가장 적합한 방법을 선택해야합니다.

Ghost의 대답 아래에 언급 된 것처럼 === 문자열을 찾고 있지만 0 키를 만나면 PHP의 유형이 다르기 때문에 다차원 배열의 키에 대해 엄격한 비교를하는 것이 좋습니다. 저글링 "기능"은 예기치 않은 결과를 제공합니다. 여기

내가 논의하고이 동작을 보여 페이지입니다 : Type juggling while making loose comparison yields unwanted result