web-dev-qa-db-fra.com

Utiliser une variable externe dans array_filter

J'ai un tableau que je veux filtrer par une variable externe. La situation est la suivante:

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

La première var_dump renvoie l'ID (qui est bien sûr défini dynamiquement), cependant, le deuxième var_dump renvoie NULL.

Quelqu'un peut-il me dire pourquoi et comment le résoudre?

35
Sander Koedood

La variable $id ne fait pas partie de la fonction. Vous devez utiliser la clause use pour rendre les variables externes accessibles:

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

Problème de portée variable!

Une solution simple serait:

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

ou, puisque 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;
});

J'espère que cela aide

7
php-dev