Usar variable externa en array_filter

2 minutos de lectura

avatar de usuario
sander koedood

Tengo una matriz, que quiero filtrar por una variable externa. La situación es la siguiente:

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

El primero var_dump devuelve el ID (que se establece dinámicamente, por supuesto), sin embargo, el segundo var_dump devuelve NULL.

¿Alguien puede decirme por qué y cómo solucionarlo?

  • qué es $bar y cuál es el valor de $bar

    – Nitish Kumar

    23 de septiembre de 2014 a las 11:46

  • @NitishKumar $bar normalmente es una matriz

    – php-dev

    23 de septiembre de 2014 a las 11:49

  • @php-dev Podemos decir que definitivamente es una matriz, porque no arroja un error de PHP. puede que no siempre definitivamente será una matriz, según el código, pero definitivamente es una matriz en el caso de uso donde obtiene el error descrito en el OP

    – José

    23 de septiembre de 2014 a las 11:54


  • Lo sentimos, de hecho es una matriz con ID.

    – Sander Koedood

    23/09/2014 a las 11:55

La variable $id no está en el alcance de la función. Necesitas usar el use cláusula para hacer accesibles las variables externas:

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

  • Nota: Requiere PHP 5.3.x… ver también stackoverflow.com/a/25994339/42223

    – drftymac

    6 de febrero de 2017 a las 22:05

  • Se requiere @dreftymac 5.3 solo para la sintaxis de funciones anónimas, no es específico para el use modificador

    – Barmar

    6 de febrero de 2017 a las 22:09

¡Problema de alcance variable!

La solución simple sería:

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

o, desde 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;
});

Espero eso ayude

  • No creo que la primera versión funcionara antes de la 5.3, ya que se agregaron funciones anónimas en la 5.3. Antes, tendrías que usar el create_function() función, junto con la global declaración.

    – Barmar

    6 de febrero de 2017 a las 22:11


Porque su función de cierre no puede ver $id. necesitas el use palabra clave:

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

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad