2016-08-24 3 views
2

array_filter가 호출되기 전에 초기화 된 배열 내부의 값을 비교하려고합니다.array_filter의 콜백 함수에서 비어 있지 않은 배열이 null이됩니다.

배열이 비어 있지 않지만 컨트롤이 array_filter의 콜백 함수 내부로 흐를 때 null이됩니다. 이것에 대한 이유는 무엇일까요?

$stream = $stream_list[$i]['@attributes']; // IS ARRAY 

$chargeable_feature = array_filter($applicable_conversions,function($conversion) { 
    return $conversion['FeatureName'] == $stream['FeaturesUsed']; 
    // STREAM BECOMES NULL HERE 
}); 
+0

범위가 다릅니다. $ stream을 익명 함수에 전달해보십시오. –

+1

$ stream이 콜백 함수의 범위를 벗어났습니다 .... 아마도'function ($ conversion) use ($ stream) {' –

답변

2

당신은 다른 영역에있어, 함수 내에서 $stream을 사용할 수 없습니다.

사용 구조체를 사용 생각해도 폐쇄라고도

$chargeable_feature = 
array_filter($applicable_conversions,function($conversion) use ($stream) { ... 

Anonymous functions

익명 함수, 더 지정된 이름이없는 함수의 생성을 허용한다.

클로저는 부모 범위에서 변수를 상속 할 수 있습니다. 이러한 모든 변수는 언어 구문을 사용해야합니다.

그리고 사용 글로벌 변수 범위의 차이에 유의 : 상위 범위로부터

상속 변수 글로벌 변수를 사용하는 것과 동일하지 않다. 전역 변수는 전역 범위에 존재하며 어떤 함수가 실행 중인지 상관없이 입니다. 클로저의 부모 범위는 클로저가 선언 된 함수입니다 ( 필연적으로이 함수가 호출 된 함수가 아님).

3
$stream = $stream_list[$i]['@attributes']; // IS ARRAY 

$chargeable_feature = array_filter($applicable_conversions,function($conversion) use ($stream) { 
    return $conversion['FeatureName'] == $stream['FeaturesUsed']; 
}); 
+1

Stack Overflow에 오신 것을 환영합니다! 이 코드가 문제를 해결할 수 있지만, [설명 포함] (http://meta.stackexchange.com/questions/114762/explaining-entirely-code-based-answers)은 게시물의 품질을 향상시키는 데 정말로 도움이됩니다. 앞으로 독자의 질문에 답하고 있으며 코드 제안의 이유를 알지 못할 수도 있습니다. 또한 주석을 설명하기 위해 코드를 군중시키지 마십시오. 그러면 코드와 설명 모두 가독성이 떨어집니다! – Rizier123

+0

감사합니다. – Vuer

관련 문제