【问题标题】:array_filter filtering out entire arrayarray_filter 过滤掉整个数组
【发布时间】:2009-06-02 18:06:21
【问题描述】:

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

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

}

【问题讨论】:

    标签: php arrays filtering


    【解决方案1】:
    $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() 对重复记录进行最好的检查并返回真/假。

    【讨论】:

    • 数字,总是那么简单。我一直在调试这个。谢谢。
    • 我添加的更新在可读性方面也有很大帮助
    【解决方案2】:

    据我所知,“==”与“=”的简单案例。

    $scan['reviewed'] = 1;
    

    这应该可以解决问题。有时最简单的问题是最难发现的;-)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-11-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多