Cómo obtener una matriz de "clave" específica en una matriz multidimensional sin bucle

115

Supongamos que tengo la siguiente matriz multidimensional (recuperada de MySQL o un servicio):

array(
    array(
        [id] => xxx,
        [name] => blah
    ),
    array(
        [id] => yyy,
        [name] => blahblah
    ),
    array(
        [id] => zzz,
        [name] => blahblahblah
    ),
)

¿Podemos obtener una matriz de ids en una llamada de función php " incorporada "? o una línea de código?
Soy consciente del bucle tradicional y obtengo el valor, pero no necesito esto:

foreach($users as $user) {
    $ids[] = $user['id'];
}
print_r($ids);

Quizás algunos array_map()y call_user_func_array()puedan hacer la magia.

ifaour
fuente
"¿Podemos obtener una matriz de identificadores en una llamada de función?" sí, pero tendrás que escribir la función
:)
@ BorisGuéry, me refiero a funciones integradas :-)
ifaour
2
PD: ¡Soy consciente de que puedo escribir foreach($users as $user) {$ids[] = $user['id'];}en una línea! pero sabes lo que quiero decir / necesito :-)
ifaour
@Eugene, obviamente necesito la matriz para otras cosas. Y de nuevo, esto es solo para divertirse y aprender nuevos atajos en PHP.
ifaour

Respuestas:

261

Desde php 5.5, puede usar array_column:

$ids = array_column($users, 'id');

Esta es la opción preferida en cualquier proyecto moderno. Sin embargo, si debe admitir php> 5.5, existen las siguientes alternativas:

Desde php 5.3, puede usar array_mapcon una función anónima, como esta:

$ids = array_map(function ($ar) {return $ar['id'];}, $users);

Antes (técnicamente php 4.0.6+) , debe crear una función anónima con en su create_functionlugar:

$ids = array_map(create_function('$ar', 'return $ar["id"];'), $users);
Phihag
fuente
bueno, ahora si hay una función nativa que es similar al function ($ar) {return $ar['id'];}valor de retorno de la clave, ¡sería increíble! :-)
ifaour
1
bueno, esa no es una función "todo en uno", pero Closure (funciones anónimas) son un concepto muy poderoso que puede usarse para dicho procesamiento, preferirá saber cómo usarlas.
Boris Guéry
¿Y si yo también quiero obtener la llave? Supongamos: $ arr = ['ball' => ['basket' => 5]]; Quiero obtener: $ ball = ['ball' => 5];
Angger
2
@Angger Entonces tienes una pregunta diferente a esta. No dude en preguntarlo siempre que mencione en detalle qué comportamiento espera, por ejemplo, qué debería resultar si la entrada es ['ball' => ['golf' => 7, 'basket' => 5, 'soccer' => 6], 'shuttle' => ['badminton' => 1]].
phihag
Desde PHP7.4 se puede usar array_mapcon una función de flecha:$ids = array_map(fn ($ar) => $ar['id'], $users);
user3601546
13

PHP 5.5+

Al iniciar PHP5.5 +, tiene array_column () disponible, lo que hace que todo lo siguiente sea obsoleto.

PHP 5.3+

$ids = array_map(function ($ar) {return $ar['id'];}, $users);

La solución de @phihag funcionará perfectamente en PHP a partir de PHP 5.3.0, si necesita soporte antes de eso, deberá copiar ese wp_list_pluck.

PHP <5.3

Wordpress 3.1+

En Wordpress hay una función llamada wp_list_pluck si estás usando Wordpress que resuelve tu problema.

PHP <5.3

Si no está utilizando Wordpress , dado que el código es de código abierto, puede copiar y pegar el código en su proyecto (y cambiar el nombre de la función a algo que prefiera, como array_pick). Ver fuente aquí

Norris
fuente
3

Si ides la primera clave en la matriz, esto servirá:

$ids = array_map('current', $users);

Sin embargo, no debe confiar necesariamente en esto. :)

deceze
fuente
-1

También puede usar array_reduce()si prefiere un enfoque más funcional

Por ejemplo:

$userNames = array_reduce($users, function ($carry, $user) {
    array_push($carry, $user['name']);
    return $carry;
}, []);

O si te gusta ser elegante

$userNames = [];
array_map(function ($user) use (&$userNames){
    $userNames[]=$user['name'];
}, $users);

Sin embargo, este y todos los métodos anteriores se repiten entre bastidores;)

Muraguri E
fuente
Su primer ejemplo no devolverá una matriz, solo el último valor encontrado para $ user ['nombre'] en la matriz. Debe presionar / agregar al $ carry y devolver el $ carry a medida que avanza.
Progrock