2014-11-20 1 views
1

PHP에서이 배열은 배열에있는 것과 일치하는 태그 배열을 기반으로 필터링해야하는 $tree입니다.in_array가 작동하지 않는 익명의 PHP 함수

Array 
(
    [0] => stdClass Object 
     (
      [name] => Introduction 
      [id] => 798162f0-d779-46b6-96cb-ede246bf4f3f 
      [tags] => Array 
       (
        [0] => client corp 
        [1] => version 2 
       ) 
     ) 

    [1] => stdClass Object 
     (
      [name] => Chapter one 
      [id] => 761e1909-34b3-4733-aab6-ebef26d3fcb9 
      [tags] => Array 
       (
        [0] => pro feature 
       ) 
     ) 
) 

내가 지금처럼 익명 함수를 사용하여 시도 :

$selectedTree = array_filter($tree, function($array) use ($selectedTags){ 
    return in_array($array->tags, $selectedTags, true); 
}); 

$ selectedTags을 :

Array 
(
    [0] => client corp 
) 

의 I는 항목 1이 반환 될 기대할 때 위의 빈 반환합니다. 오류가 발생하지 않았습니다. 내가 뭘 놓치고 있니?

+0

죄송합니다. 현재의 행동이 무엇인지 분명하지 않습니다. 작동하지 않습니까? 올바르게 필터링하지 않습니까? 그것은 예외를 던지고 있습니까? –

+0

@ChrisForrence 죄송합니다. 필터링되지 않았습니다 (즉, 비어 있음). 오류가 발생하지 않았습니다. – greener

+3

함수는 배열 인'$ array-> tags'에서'$ selectedTags'를 검색합니다. 'in_array()'는 배열이 정확히 일치하는 경우 (같은 내용의 요소 수가 같은 경우)에만 true를 반환합니다. 한 배열을 반복하면서 다른 배열의 각 요소를 차례로 검색해야합니다. –

답변

2

in_array($neddle, $haystack)의 경우. $neddleString 일 필요가 있습니다.하지만 왜 제대로 작동하지 않는지에 대한 배열을 제공하고 있습니다. 당신이 $selectedTags의 값으로 배열을 전달하고자하는 경우

그런데 당신은 다음과 같은 것을 시도 할 수 있습니다 :

$selectedTree = array_filter($tree, function($array) use ($selectedTags){ 
    return count(array_intersect($array->tags, $selectedTags)) > 0; 
}); 

참조 : 내가 제대로 질문을 읽고 있어요 경우 array_intersect

+0

아, 그냥 날 구타해라. – robbmj

+0

굉장해. 너는 내 하루를 보냈다! – greener

2

, 당신이 볼 필요가 각각의 객체가 $tree 배열에 있고 태그 속성에 요소 중 하나가 포함되어 있는지 확인하십시오.

여기에는 절차 적 방법이 있습니다.

$filtered = array(); 
foreach ($tree as $key => $obj) { 
    $commonElements = array_intersect($selectedTags, $obj->tags); 
    if (count($commonElements) > 0) { 
     $filtered[$key] = $obj; 
    } 
} 

나는이 작업을 수행하는 기능적인 방법을 게시 할 예정 이었지만, 해당 구현에 대한 thecodeparadox의 답변을 참조하십시오.

관련 문제