Etiqueta: Arrays

  • Cómo ordenar un array multidimensional en PHP

    Cómo ordenar un array multidimensional en PHP

    La estructura de datos más utilizada en PHP es, por lejos, el arreglo.

    Esto se debe a que la implementación de ellos es extremadamente flexible.

    Un problema común que nos encontramos es el ordenarlos.

    Cuando los arreglos son de una única dimensión no hay mucho problema, basta una función como sort, pero cuando el arreglo es una matriz las cosas son un poco más complejas ya que pueden existir diferentes criterios de ordenamiento.

    Por ejemplo, si tu arreglo se ve así:

    [
     [
       'name' => 'Juan',
      'age' => 40,
     ],
       'name' => 'Alberto',
       'age' => 60,
     ],
    ]

    El resultado será diferente si queremos ordenar por age que por name

    Claro que podrías usar una solución diseñada por tí mismo basada en un par de ciclos anidados y seguramente funcionaría, pero sería trabajar de más.

    Ordenar un arreglo PHP según un criterio propio

    Una función muy útil para resolver este tipo de situación es usort.

    Esta función recibe un arreglo como parámetro y una función que se utiliza para comparar cualquier par de elementos entre sí (Lo que se conoce como un callback).

    De este modo, para el ejemplo anterior podríamos definir dos funciones de comparación:

    1. Por nombre
    2. Por edad
    function compareByName(array $elem1, array $elem2) {
        if ( $elem1['name'] > $elem2['name'] ) {
              return 1;
        } elseif ( $elem1['name'] < $elem2['name'] ) {
              return -1;
        } else {
              return 0;
        }
    }
    
    function compareByAge(array $elem1, array $elem2) {
        if ( $elem1['age'] > $elem2['age'] ) {
              return 1;
        } elseif ( $elem1['age'] < $elem2['age'] ) {
              return -1;
        } else {
              return 0;
        }
    }

    Cualquiera de estas podría ser utilizada, según el criterio que necesites, por ejemplo:

    usort($people, 'compareByName');

    O podríamos usar también una función anónima:

    usort($people, function( array $elem1, $elem2 ) {
        if ( $elem1['age'] > $elem2['age'] ) {
              return 1;
        } elseif ( $elem1['age'] < $elem2['age'] ) {
              return -1;
        } else {
              return 0;
        }
    });

    O, si estás usando php7 o superior:

    usort($people, function( array $elem1, $elem2 ) {
        return $elem1['name'] <=> $elem2['name'];
    });

  • Cómo filtrar un arreglo multidimensional por clave en PHP

    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