我有一个数组数组,每个数组都包含医疗设备扫描的详细信息。我从每晚转储的文本日志中获取此数据。格式如下:
$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;
}
答案 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;
那就是诀窍。有时最简单的问题是最难发现的; - )