Странное поведение фильтра массива - PullRequest
0 голосов
/ 29 апреля 2020

Поэтому я не могу понять, почему приведенный ниже код работает так, как он работает.

<?php

$values = [
    [
      'key' => 'value',
      'key2' => 'value2'
    ]
];

function filter($values, $flag = false) {
    return array_filter(
        $values,
        function ($record) use ($flag) {
            return $record['not_existing_key'] == 'not_existing_value'
                && $record['not_existing_key2'] == $flag ? '' : 'not_existing_value2';
        }
    );
}

print_r(filter($values));

Вывод приведенного выше кода:

Array
(
    [0] => Array
        (
            [key] => value
            [key2] => value
        )

)

Как я понимаю, && оператор в PHP, второе условие даже не должно обрабатываться, если первое является ложным (что, очевидно, имеет место в этом случае), однако, если мы удаляем вторую часть условия, оно работает как исключение - оно не возвращает никакого значения. Прямо сейчас, эта функция как-то возвращает значение.

Может кто-нибудь объяснить, как это работает?

1 Ответ

3 голосов
/ 29 апреля 2020

У вас приоритет оператора проблема: && и == имеют более высокий приоритет, чем ?:, поэтому ваш код интерпретируется как:

($record['not_existing_key'] == 'not_existing_value'
&& $record['not_existing_key2'] == $flag) ? '' : 'not_existing_value2';

, который с первое условие ложно, оценивается как 'not_existing_value2', что считается true в логическом контексте.

Вам необходимо добавить скобки, чтобы получить требуемый порядок оценки:

return $record['not_existing_key'] == 'not_existing_value'
    && $record['not_existing_key2'] == ($flag ? '' : 'not_existing_value2');

Демонстрация на 3v4l.org

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