2009-06-02 2 views
0

배열 배열을 가지고 있습니다. 각 배열에는 의료 기기에서 스캔 한 세부 정보가 들어 있습니다. 야간에 덤프되는 텍스트 로그에서이 데이터를 가져옵니다. 의 형식이있다 :array_filter 전체 배열 필터링

$this->scans = array(
    array( 
    'patientid' => (int), 
    'patientname' => 'John Skeet', 
    'reviewed' => 0 or 1 
    //plus more irrelevant 
), 
    array(
    //same as above 
), //etc 
) 

이 충분히 높은 품질의 경우, 각각의 스캔이 검토 될 수 있으므로 중요한 키 배열은 여기 reviewed이다. 그러나 텍스트 로그는 획득 한 모든 검사를 덤프하고 다시 검토 한 다음 검토 된 검사를 다시 나열합니다.

이제 중복을 방지하기 위해 array_filter을 사용하여 검토 및 검토 된 (검토 된 버전 유지) 스캔을 필터링 할 수 있다고 생각했습니다. 그러나 필터 함수는 일부 드문 경우를 제외하고 전체 배열을 필터링합니다. 누군가가 한 번 봐서 나를 왜 그들이 그것이 일어나고 있다고 생각하는지 알려 주시면 감사하겠습니다.

$this->scans = array_filter($this->scans, array($this, "scan_cleanup")); 

.

private function scan_cleanup($scan) { 
     //only if the scan was not reviewed 
    if ($scan['reviewed'] == 0) { 
       //change reviewed status to see if there is a duplicate 
     $scan['reviewed'] == 1; 
       //return false to remove this copy (and keep reviewed) 
     if (in_array($scan, $this->scans)) { 
      return false; 
     } 
    } 
    return true; 

} 

답변

2
$scan['reviewed'] == 1; 

$scan['reviewed'] = 1; 

하나는이 조건이 컨텍스트에서 아무것도하지 않는 것을 다른이 없을 것입니다.

return false도 자주 실행하지 않습니다. 나는 약간의 리팩토링 (조건 체크를 꺼내는 것)을 조금 더 명확하게하기 위해 로직을 약간 바꿀 것이다.

if ($scan['reviewed'] and hasDupe($scan)) { 
    return false; // filter out 
} 
return true; // it is passed back, and is output 

hasDupe()는 중복 레코드에 대해 가장 잘 확인하고 true/false를 반환합니다.

+0

그림이 항상 그렇게 단순합니다. 나는 이것을 영원히 디버깅하는 것을 보냈다. 감사. – tj111

+1

내가 추가 한 업데이트는 가독성 측면에서도 많은 도움이 될 것입니다. –

1

"=="대 "="의 간단한 사례를 볼 수 있습니다.

$scan['reviewed'] = 1; 

그럴 필요가 있습니다. 때로는 가장 간단한 문제가 가장 찾기가 힘듭니다 .-)