ejemplo - PHP array_filter, ¿cómo obtener la clave en la devolución de llamada?
in array php (5)
En un comentario anterior describiste que en realidad estás buscando algo como esto:
foreach ($t as $k => $v)
if (!array_key_exists($k, $valid))
unset($t[$k])
Por lo tanto, para eliminar todos los valores de la matriz $t
que no tienen una clave en la matriz $valid
.
La función PHP para eso se llama array_intersect_key
. La intersección es igual al resultado filtrado:
$filtered = array_intersect_key($t, $valid);
array_filter - Filtra los elementos de una matriz usando una función de devolución de llamada
array array_filter (array $ input [, callback $ callback])
¿Puede la devolución de llamada obtener la clave del valor de matriz actual y cómo?
No hay forma de que la devolución de llamada de array_filter
acceda a la clave del elemento, ni existe una función similar que haga lo que usted desea.
Sin embargo, puede escribir su propia función para esto, como la siguiente:
function arrayfilter(array $array, callable $callback = null) {
if ($callback == null) {
$callback = function($key, $val) {
return (bool) $val;
};
}
$return = array();
foreach ($array as $key => $val) {
if ($callback($key, $val)) {
$return[$key] = $val;
}
}
return $return;
}
$test_array = array(''foo'', ''a'' => ''the a'', ''b'' => ''the b'', 11 => 1101, '''', null, false, 0);
$array = arrayfilter($test_array, function($key, $val) {
return is_string($key);
});
print_r($array);
/*
Array
(
[a] => the a
[b] => the b
)
*/
$array = arrayfilter($test_array);
print_r($array);
/*
Array
(
[0] => foo
[a] => the a
[b] => the b
[11] => 1101
)
*/
De la documentación: PHP 5.6.0 Se agregó el parámetro de indicador opcional y las constantes ARRAY_FILTER_USE_KEY y ARRAY_FILTER_USE_BOTH
No me gustaron las otras opciones sugeridas aquí, si alguien más está buscando esta característica, aquí hay una implementación rápida:
function array_filter_keys($a, $c){
$i=array_filter(array_keys($a), $c);
return array_intersect_key($a, array_flip($i));
}
El resultado de esta función es exactamente como suena, devolverá una matriz filtrada por una función de devolución de llamada que recibe las claves en lugar de los valores.
EDITAR: Esto es más que un descargo de responsabilidad, después de leer algunos de los otros comentarios, me doy cuenta de que el OP en realidad solo está buscando array_intersect
como señaló Hakre. Sin embargo, dejaré esta respuesta aquí porque la pregunta de OP no indica claramente esa necesidad y esta página aparece en google para array_filter_keys
Puede usar la función array_walk como se discute aquí (3ra respuesta abajo): ¿ es posible si la devolución de llamada en array_filter recibe el parámetro?