array_filter отфильтровывает весь массив - PullRequest
0 голосов
/ 02 июня 2009

У меня есть массив массивов, каждый из которых содержит подробности сканирования медицинским устройством. Я получаю эти данные из текстовых журналов, которые сбрасываются каждую ночь. Формат которого таков:

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

2 голосов
/ 02 июня 2009
$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.

1 голос
/ 02 июня 2009

Насколько я вижу, простой случай "==" против "=".

$scan['reviewed'] = 1;

Это должно сделать трюк. Иногда самые простые проблемы труднее всего обнаружить; -)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...