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.


"¿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);

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í


3

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

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

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


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


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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.