array_filter过滤掉整个数组

时间:2009-06-02 18:06:21

标签: php arrays filtering

我有一个数组数组,每个数组都包含医疗设备扫描的详细信息。我从每晚转储的文本日志中获取此数据。格式如下:

$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 个答案:

答案 0 :(得分:2)

$scan['reviewed'] == 1;

vs

$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。

答案 1 :(得分:1)

就我所知,“==”与“=”的简单情况。

$scan['reviewed'] = 1;

那就是诀窍。有时最简单的问题是最难发现的; - )