Pregunta

Digamos, por ejemplo, que acaba de consultar una base de datos y recibió esta matriz 2D.

$results = array(
    array('id' => 1, 'name' => 'red'  , 'spin' =>  1),
    array('id' => 2, 'name' => 'green', 'spin' => -1),
    array('id' => 3, 'name' => 'blue' , 'spin' => .5)
);

A menudo me encuentro escribiendo bucles como este.

foreach($results as $result)
    $names[] = $result['name'];

Mis preguntas es ¿existe una forma de obtener esta matriz $ nombres sin usar un bucle? El uso de funciones de devolución de llamada cuenta como un bucle.

Aquí hay un ejemplo más genérico de obtener todos los campos.

foreach($results as $result)
    foreach($result as $key => $value)
        $fields[$key][] = $value;
¿Fue útil?

Solución

A partir del 20 de junio en PHP-5.5 hay una nueva función array_column

Por ejemplo:

$records = array(
    array(
        'id' => 2135,
        'first_name' => 'John',
        'last_name' => 'Doe'
    ),
    array(
        'id' => 3245,
        'first_name' => 'Sally',
        'last_name' => 'Smith'
    ),
    array(
        'id' => 5342,
        'first_name' => 'Jane',
        'last_name' => 'Jones'
    ),
    array(
        'id' => 5623,
        'first_name' => 'Peter',
        'last_name' => 'Doe'
    )
);


$firstNames = array_column($records, 'first_name');
print_r($firstNames);

Volverá

Array
(
    [0] => John
    [1] => Sally
    [2] => Jane
    [3] => Peter
)

Hay incluso más ejemplos en el enlace mencionado anteriormente.

Otros consejos

He votado la respuesta de @ Devon porque realmente no hay una manera de hacer lo que estás preguntando con una función incorporada. Lo mejor que puedes hacer es escribir el tuyo:

function array_column($array, $column)
{
    $ret = array();
    foreach ($array as $row) $ret[] = $row[$column];
    return $ret;
}

Al iniciar PHP 5.3, puedes usar esta bonita llamada con la función lambda:

$names = array_map(function ($v){ return $v['name']; }, $results);

Esto devolverá la matriz dividida por la dimensión 'nombre'.

En pocas palabras, no.

Necesitará usar un bucle o una función de devolución de llamada como array_walk .

Hice más investigación sobre esto y descubrí que ruby ??y prototype tienen una función que hace esto llamada array_pluck , 2 . Es interesante que array_map tenga un segundo uso que te permita hacer lo inverso a lo que quiero hacer aquí. También encontré una clase PHP que alguien está escribiendo para emular la manipulación de prototipos de arrays.

Voy a investigar un poco más y, si no encuentro nada, trabajaré en un parche para enviarlo a la lista de correo internals@lists.php.net y ver si agregan array_pluck.

Para aquellos de ustedes que no pueden actualizarse a PHP5.5 en este momento y necesitan esta función, aquí hay una implementación de array_column .

function array_column($array, $column){
    $a2 = array();
    array_map(function ($a1) use ($column, &$a2){
        array_push($a2, $a1[$column]);
    }, $array);
    return $a2;
}

Si está ejecutando una versión de PHP anterior a 5.5 y array_column () , puede usar el reemplazo oficial en PHP simple:

https://github.com/ramsey/array_column

Creo que esto hará lo que quieras

array_uintersect_uassoc

Tendrías que hacer algo como esto

$results = array(
    array('id' => 1, 'name' => 'red'  , 'spin' =>  1),
    array('id' => 2, 'name' => 'green', 'spin' => -1),
    array('id' => 3, 'name' => 'blue' , 'spin' => .5)
);
$name = array_uintersect_uassoc( $results, array('name' => 'value')  , 0, "cmpKey");
print_r($name);

//////////////////////////////////////////////////
// FUNCTIONS
//////////////////////////////////////////////////
function cmpKey($key1, $key2) {
  if ($key1 == $key2) {
    return 0;
  } else {
    return -1;
  }
}

Sin embargo, no tengo acceso a PHP5, así que no he probado esto.

Podrías hacer:

$tmp = array_flip($names);
$names = array_keys($tmp);

Esta es una alternativa de función rápida de array_column ()

if(!function_exists('array_column')) {
    function array_column($element_name) {
        $ele =   array_map(function($element) {
            return $element[$element_name];
        }, $a);
        return  $ele;
    }
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top