Cómo filtrar un arreglo multidimensional por clave en PHP

Me llegó esta pregunta a través de twitter:

Veamos el arreglo en mayor detalle:

Por lo que se ve, se trata de un array de arrays. El primer índice es por número y la segunda dimensión tiene índices string y, viendo el contenido del mismo entiendo que se trata del resultado de alguna consulta a una base de datos (Siendo que los elementos parecen tener la misma estructura y especialmente al haber un elemento llamado «id»).

Muy bien, entonces el objetivo sería obtener sólo aquellos elementos en los cuales la columna «condial_39» vale 1, en este caso sería el array completo, pero obviamente este podría no ser el caso.

Se me ocurren diferentes formas de lograr este objetivo:

A la vieja usanza

Simplemente se trata de hacer una recorrida del arreglo e ir recolectando los elementos buscados:

<?php

$r = [];
foreach ( $array as $k => $v ) {        
        if ( $v['condial_39'] == 1 ) {
                $r[$k] = $v;
        }
}

Al final de esta recorrida tendremos el resultado buscado en el arreglo $r.

Nada espectacular pero da el resultado buscado.

Usando un poco de programación funcional

Ahora, viendo la pregunta original (que pide qué función de php se puede usar), se me ocurre un modo algo más elaborado, pero ciertamente más claro (y tal vez más eficiente):

<?php

$r = array_filter( $a, function( $e ) {

        return $e['condial_39'] == 1;
});

Aquí estamos usando la función array_filter en combinación con una función anónima que encapsula el criterio de filtro.

Al fin de cuentas diría que es cuestión de gustos (Yo personalmente elijo la segunda opción).

Ejemplo completo

El código:

<?php

$a = [
        1 => [ 'id' => '23432aasasd', 'condial_39' => 1, 'nombre' => 'Juan' ],
        2 => [ 'id' => '26345awq2sd', 'condial_39' => 0, 'nombre' => 'Pedro'],
];

$r = array_filter( $a, function( $e ) {

        return $e['condial_39'] == 1;
});

print_r($r);
echo PHP_EOL;

El resultado:

¿Tenés alguna pregunta para hacerme? Dejá un comentario, mandame un twit o un correo

mchojrin

Por mchojrin

Ayudo a desarrolladores PHP a afinar sus habilidades técnicas y avanzar en sus carreras

2 comentarios

  1. ¿Se puede pasar otro parámetro a la función de llamada en el array_filter? Con ello busco utilizar el segundo parámetro para definir el valor de la búsqueda

    1. Hola Ivan:

      Personalmente nunca lo he requerido pero es posible crear un callback para array_filter que reciba dos argumentos. Lo que hará internamente la función array_filter será pasar, no sólo el valor de cada elemento del arreglo definido en el primer parámetro, si no también su clave. Para activar este funcionamiento debes agregar un tercer parámetro a tu llamada: ARRAY_FILTER_USE_BOTH.

      Sería algo así como:

      array_filter( [ 'a' => 1, 'b' => 2, 'c' => 3], fn ($v, $k) => $v < 1 && $k == 'a', ARRAY_FILTER_USE_BOTH );

      Saludos,

¿Te quedó alguna duda? Publica aca tu pregunta

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.