manejo - En PHP, ¿hay una función que devuelve una matriz compuesta del valor de una clave de una matriz de matrices asociativas?
imprimir datos de un array php (8)
¿Dónde está lisp cuando lo necesitas? En realidad, en PHP es bastante fácil de administrar también. Solo usa la función array_map como se ilustra abajo.
# bunch o data
$data = array();
$data[0] = array("id" => 100, "name" => ''ted'');
$data[1] = array("id" => 200, "name" => ''mac'');
$data[2] = array("id" => 204, "name" => ''bub'');
# what you want to do to each bit of it
function pick($n) { return($n[''id'']); }
# what you get after you do that
$map = array_map("pick", $data);
# see for yourself
print_r($map);
Estoy seguro de que esta pregunta se ha hecho antes, mis disculpas por no encontrarla primero.
La matriz original:
[0] => Array
(
[categoryId] => 1
[eventId] => 2
[eventName] => 3
[vendorName] => 4
)
[1] => Array
(
[categoryId] => 5
[eventId] => 6
[eventName] => 7
[vendorName] => 8
)
[2] => Array
(
[categoryId] => 9
[eventId] => 10
[eventName] => 11
[vendorName] => 12
)
Mi resultado esperado de: print_r (get_values_from_a_key_in_arrays (''categoryId'', $ array));
[0] => 1
[1] => 5
[2] => 9
Solo estoy buscando algo más limpio que escribir mi propia función basada en foreach. Si foreach es la respuesta, ya tengo eso en su lugar.
Edición: no quiero usar una clave codificada, solo estaba mostrando un ejemplo de llamada a la solución. ¡Gracias! ^ _ ^
Solución Quick Grab para PHP 5.3:
private function pluck($key, $data) {
return array_reduce($data, function($result, $array) use($key) {
isset($array[$key]) && $result[] = $array[$key];
return $result;
}, array());
}
A partir de PHP 5.5, use array_column
:
$events = [
[ ''categoryId'' => 1, ''eventId'' => 2, ''eventName'' => 3, ''vendorName'' => 4 ],
[ ''categoryId'' => 5, ''eventId'' => 6, ''eventName'' => 7, ''vendorName'' => 8 ],
[ ''categoryId'' => 9, ''eventId'' => 10, ''eventName'' => 11, ''vendorName'' => 12 ],
];
print_r(array_column($events, ''categoryId''));
Para versiones anteriores a la 5.5, puede considerar utilizar un polyfill .
Mapeo es lo que necesitas:
$input = array(
array(
''categoryId'' => 1,
''eventId'' => 2,
''eventName'' => 3,
''vendorName'' => 4,
),
array(
''categoryId'' => 5,
''eventId'' => 6,
''eventName'' => 7,
''vendorName'' => 8,
),
array(
''categoryId'' => 9,
''eventId'' => 10,
''eventName'' => 11,
''vendorName'' => 12,
),
);
$result = array_map(function($val){
return $val[''categoryId''];
}, $input);
O creando la función que querías:
function get_values_from_a_key_in_arrays($key, $input){
return array_map(function($val) use ($key) {
return $val[$key];
}, $input);
};
y luego usándolo:
$result = get_values_from_a_key_in_arrays(''categoryId'', $array);
Funcionará en PHP> = 5.3, donde se permiten devoluciones de llamadas anónimas. Para versiones anteriores, deberá definir la devolución de llamada antes y pasar su nombre en lugar de la función anónima.
No hay función incorporada. Pero uno se hace fácilmente con array_map()
.
$array = array(
array(
"categoryID" => 1,
"CategoryName" => 2,
"EventName" => 3,
"VendorName" => 4
),
array(
"categoryID" => 5,
"CategoryName" => 6,
"EventName" => 7,
"VendorName" => 8
),
array(
"categoryID" => 9,
"CategoryName" => 10,
"EventName" => 11,
"VendorName" => 12
)
);
$newArray = array_map(function($el) {
return $el["categoryID"];
}, $array);
var_dump($newArray);
No hay una función incorporada para esto, pero generalmente se denomina " pluck ".
Podría usar array_filter y pasar una función basada en la clave deseada.
Sin embargo, la respuesta de Tadeck es mucho mejor.
Por lo tanto, lo bueno de las funciones de recopilación / iterador de higher-order tales como pluck , filter , each , el map y los amigos es que pueden combinarse y combinarse para componer un conjunto más complejo de operaciones.
La mayoría de los idiomas proporcionan este tipo de funciones (busque paquetes como colección, iterador o enumeración / enumerable) ... algunos proporcionan más funciones que otros y comúnmente verá que las funciones tienen nombres diferentes entre idiomas (es decir, recopile == mapa, reducir == pliegue). Si una función no existe en su idioma, puede crearla a partir de las que existen.
En cuanto a su caso de prueba ... podemos usar array_reduce para implementar pluck . La primera versión que array_map
basó en array_map
; sin embargo, estoy de acuerdo con @salathe que array_reduce es más sucinto para esta tarea; array_map es una opción array_map , pero al final tendrás que hacer más trabajo. array_reduce
puede parecer un poco extraño al principio, pero si la devolución de llamada está bien organizada, todo está bien.
Un pluck
menos ingenuo también verificará si puede "llamar" (una función / método) en el valor iterado. En la implementación ingenua a continuación, asumimos que la estructura es un hash (matriz asociativa).
Esto configurará los datos del caso de prueba (Fixtures):
<?php
$data[] = array(''categoryId'' => 1, ''eventId'' => 2, ''eventName'' => 3, ''vendorName'' => 4);
$data[] = array(''categoryId'' => 5, ''eventId'' => 6, ''eventName'' => 7, ''vendorName'' => 8);
$data[] = array(''categoryId'' => 9, ''eventId'' => 10, ''eventName'' => 11, ''vendorName'' => 12);
$data[] = array(/* no categoryId */ ''eventId'' => 10, ''eventName'' => 11, ''vendorName'' => 12);
$data[] = array(''categoryId'' => false,''eventId'' => 10, ''eventName'' => 11, ''vendorName'' => 12);
$data[] = array(''categoryId'' => 0.0, ''eventId'' => 10, ''eventName'' => 11, ''vendorName'' => 12);
Elige la versión de desplumar que prefieras
$preferredPluck = ''pluck_array_reduce''; // or pluck_array_map
"desplume" para PHP 5.3+: array_reduce proporciona una implementación concisa, aunque no es tan fácil de razonar como la versión array_map:
function pluck_array_reduce($key, $data) {
return array_reduce($data, function($result, $array) use($key){
isset($array[$key]) &&
$result[] = $array[$key];
return $result;
}, array());
}
"desplumar" para PHP 5.3+: array_map no es perfecto para esto, así que tenemos que hacer más comprobaciones (y aún no tiene en cuenta muchos casos potenciales):
function pluck_array_map($key, $data) {
$map = array_map(function($array) use($key){
return isset($array[$key]) ? $array[$key] : null;
}, $data);
// is_scalar isn''t perfect; to make this right for you, you may have to adjust
return array_filter($map, ''is_scalar'');
}
"pluck" para PHP heredado <5.3
Podríamos haber usado el legado create_function ; sin embargo, es de mala forma, no se recomienda y tampoco es nada elegante, por lo tanto, he decidido no mostrarlo.
function pluck_compat($key, $data) {
$map = array();
foreach ($data as $array) {
if (array_key_exists($key, $array)) {
$map[] = $array[$key];
}
}
unset($array);
return $map;
}
Aquí elegimos una versión de "pluck" para llamar en función de la versión de PHP que estamos ejecutando. Si ejecuta la secuencia de comandos completa, debe obtener la respuesta correcta sin importar en qué versión se encuentre.
$actual = version_compare(PHP_VERSION, ''5.3.0'', ''>='')
? $preferredPluck(''categoryId'', $data)
: pluck_compat(''categoryId'', $data);
$expected = array(1, 5, 9, false, 0.0);
$variance = count(array_diff($expected, $actual));
var_dump($expected, $actual);
echo PHP_EOL;
echo ''variance: '', $variance, PHP_EOL;
print @assert($variance)
? ''Assertion Failed''
: ''Assertion Passed'';
Note que no hay un final ''?>''. Eso es porque no es necesario. Puede salir más bien de dejarlo fuera que de mantenerlo cerca.
FWIW, parece que esto se está agregando a PHP 5.5 como array_column .
<?php
$a = array(
array(''a'' => 1, ''b'' => 2),
array(''a'' => 2, ''b'' => 2),
array(''a'' => 3, ''b'' => 2),
array(''a'' => 4, ''b'' => 2)
);
function get_a($v) {
return $v[''a''];
}
var_dump(array_map(''get_a'', $a));
Puede utilizar una función de creación o una función anónima (PHP 5.3> =)
<?php
$a = array(
array(''a'' => 1, ''b'' => 2),
array(''a'' => 2, ''b'' => 2),
array(''a'' => 3, ''b'' => 2),
array(''a'' => 4, ''b'' => 2)
);
var_dump(array_map(create_function(''$v'', ''return $v["a"];''), $a));
Escribiría una función de devolución de llamada, como antes, y luego la utilizaría con array_map.