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

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

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

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

30

Решение

Переменная $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;
});
64

Другие решения

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

Простое исправление будет:

$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

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

$foo = array_filter($bar, function($obj) use ($id) {
5