Использовать внешнюю переменную в фильтре массива


У меня есть массив, который я хочу отфильтровать по внешней переменной. Ситуация выглядит следующим образом:

$id = '1';
var_dump($id);
$foo = array_filter($bar, function($obj){
    if (isset($obj->foo)) {
        var_dump($id);
        if ($obj->foo == $id) return true;
    }
    return false;
});

Первый var_dump возвращает идентификатор (который, конечно, динамически устанавливается), однако второй var_dump возвращает значение NULL.

Может ли кто-нибудь сказать мне, почему и как это решить?

Author: dreftymac, 2014-09-23

3 answers

Переменная $id не входит в область действия функции. Вам нужно использовать предложение use, чтобы сделать внешние переменные доступными:

$foo = array_filter($bar, function($obj) use ($id) {
    if (isset($obj->foo)) {
        var_dump($id);
        if ($obj->foo == $id) return true;
    }
    return false;
});
 55
Author: Barmar, 2014-09-23 11:49:00

Проблема с областью действия переменной!

Простым исправлением было бы:

$id = '1';
var_dump($id);
$foo = array_filter($bar, function($obj){
    global $id;
    if (isset($obj->foo)) {
        var_dump($id);
        if ($obj->foo == $id) return true;
    }
    return false;
}); 

Или, начиная с PHP 5.3

$id = '1';
var_dump($id);
$foo = array_filter($bar, function($obj) use ($id) {
    if (isset($obj->foo)) {
        var_dump($id);
        if ($obj->foo == $id) return true;
    }
    return false;
});

Надеюсь, это поможет

 7
Author: php-dev, 2014-09-23 11:48:40

Потому что ваша функция закрытия не может видеть $id. Вам нужно ключевое слово use:

$foo = array_filter($bar, function($obj) use ($id) {
 5
Author: Joe, 2014-09-23 11:48:25