Verwenden Sie eine externe Variable in array_filter

Lesezeit: 2 Minuten

Benutzer-Avatar
Sander Koedood

Ich habe ein Array, das ich nach einer externen Variable filtern möchte. Die Situation ist wie folgt:

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

Der Erste var_dump gibt die ID zurück (die natürlich dynamisch gesetzt wird), jedoch die zweite var_dump gibt NULL zurück.

Kann mir jemand sagen warum und wie man es löst?

  • was ist $bar und was ist der Wert von $bar

    – Nitish Kumar

    23. September 2014 um 11:46 Uhr

  • @NitishKumar $bar ist normalerweise ein Array

    – php-dev

    23. September 2014 um 11:49 Uhr

  • @php-dev Wir können sagen, dass es definitiv ein Array ist, weil es keinen PHP-Fehler auslöst. Es darf nicht stets definitiv ein Array sein, abhängig vom Code, aber es ist definitiv ein Array in dem Anwendungsfall, in dem er den im OP beschriebenen Fehler erhält

    – Jo

    23. September 2014 um 11:54 Uhr


  • Entschuldigung, es ist tatsächlich ein Array mit IDs.

    – Sander Koedood

    23. September 2014 um 11:55 Uhr

Die Variable $id liegt nicht im Funktionsumfang. Sie müssen die verwenden use -Klausel, um externe Variablen zugänglich zu machen:

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

  • Notiz: Benötigt PHP 5.3.x … siehe auch stackoverflow.com/a/25994339/42223

    – dreftymac

    6. Februar 2017 um 22:05 Uhr

  • @dreftymac 5.3 ist nur für die Syntax anonymer Funktionen erforderlich, es ist nicht spezifisch für die use Modifikator.

    – Barmar

    6. Februar 2017 um 22:09 Uhr

Problem mit variablem Umfang!

Einfache Lösung wäre:

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

oder seit 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;
});

Ich hoffe es hilft

  • Ich glaube nicht, dass die erste Version vor 5.3 funktionieren würde, da anonyme Funktionen in 5.3 hinzugefügt wurden. Früher müssten Sie die verwenden create_function() Funktion, zusammen mit der global Erklärung.

    – Barmar

    6. Februar 2017 um 22:11 Uhr


Weil Ihre Verschlussfunktion nicht sehen kann $id. Du brauchst die use Stichwort:

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

1344280cookie-checkVerwenden Sie eine externe Variable in array_filter

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy