La función de devolución de llamada array_filter()
solo pasa los valores de la matriz, no las claves.
Si tengo:
$my_array = array("foo" => 1, "hello" => "world");
$allowed = array("foo", "bar");
¿Cuál es la mejor manera de eliminar todas las claves $my_array
que no están en la $allowed
matriz?
Salida deseada:
$my_array = array("foo" => 1);
$b = ['foo' => $a['foo'], 'bar' => $a['bar']]
Esto resultará en$b['bar']
sernull
.Respuestas:
PHP 5.6 introdujo un tercer parámetro a
array_filter()
,flag
, que se puede configurar paraARRAY_FILTER_USE_KEY
que va a filtrar clave en lugar del valor:Claramente, esto no es tan elegante como
array_intersect_key($my_array, array_flip($allowed))
, pero ofrece la flexibilidad adicional de realizar una prueba arbitraria contra la tecla, por ejemplo,$allowed
podría contener patrones de expresiones regulares en lugar de cadenas simples.También puede usar
ARRAY_FILTER_USE_BOTH
para pasar tanto el valor como la clave a su función de filtro. Aquí hay un ejemplo artificial basado en el primero, pero tenga en cuenta que no recomendaría codificar las reglas de filtrado de$allowed
esta manera:fuente
array_intersect
Con
array_intersect_key
yarray_flip
:fuente
array_flip
? Simplemente defina las$allowed
teclas con:allowed = array ( 'foo' => 1, 'bar' => 1 );
Necesitaba hacer lo mismo, pero con un
array_filter
teclado más complejo .Así es como lo hice, usando un método similar.
Esto genera el resultado:
fuente
Aquí hay una solución más flexible que usa un cierre:
Salidas:
Entonces, en la función, puede hacer otras pruebas específicas.
fuente
Si está buscando un método para filtrar una matriz por una cadena que aparece en las claves, puede usar:
El resultado de
print_r($mResult)
esUna adaptación de esta respuesta que admite expresiones regulares
Salida
fuente
stristr
dentro del "trabajo" de la función es hacer algunas suposiciones para el usuario final. Quizás sería mejor permitir que el usuario pase una expresión regular; esto les daría una mayor flexibilidad sobre ciertas cosas como anclas, los límites de palabra y de mayúsculas y minúsculas, etc.Cómo obtener la clave actual de una matriz cuando se usa
array_filter
Independientemente de cómo me gusta la solución de Vincent para el problema de Maček, en realidad no se usa
array_filter
. Si viniste aquí desde un motor de búsqueda, tal vez estabas buscando algo como esto ( PHP> = 5.3 ):Pasa la matriz que está filtrando como referencia a la devolución de llamada. Como
array_filter
no itera convencionalmente sobre la matriz aumentando su puntero interno público, debe avanzarlo usted mismo.Lo importante aquí es que debe asegurarse de que su matriz se restablezca, de lo contrario, podría comenzar justo en el medio.
En PHP> = 5.4 puede hacer que la devolución de llamada sea aún más corta:
fuente
Aquí hay una alternativa menos flexible usando unset () :
El resultado de
print_r($array)
ser:Esto no es aplicable si desea mantener los valores filtrados para su uso posterior pero más ordenado, si está seguro de que no.
fuente
unset()
. No se emiten advertencias si la clave no existe.A partir de PHP 5.6, puede usar la
ARRAY_FILTER_USE_KEY
bandera enarray_filter
:De lo contrario, puede usar esta función ( desde TestDummy ):
Y aquí hay una versión aumentada mía, que acepta una devolución de llamada o directamente las claves:
Por último, pero no menos importante, también puede usar un simple
foreach
:fuente
Tal vez una exageración si la necesita solo una vez, pero puede usar la biblioteca YaLinqo * para filtrar colecciones (y realizar cualquier otra transformación). Esta biblioteca permite realizar consultas similares a SQL en objetos con sintaxis fluida. Su
where
función acepta una devolución de llamada con dos argumentos: un valor y una clave. Por ejemplo:(La
where
función devuelve un iterador, por lo que si solo necesita iterarforeach
sobre la secuencia resultante una vez,->toArray()
puede eliminarse).* desarrollado por mí
fuente
función de filtro de matriz de php:
$ array: es la matriz de entrada
$ callback_function: la función de devolución de llamada que se utilizará, si la función de devolución de llamada devuelve verdadero , el valor actual de la matriz se devuelve a la matriz de resultados.
$ flag: es un parámetro opcional , determinará qué argumentos se envían a la función de devolución de llamada. Si este parámetro está vacío, la función de devolución de llamada tomará los valores de la matriz como argumento. Si desea enviar una clave de matriz como argumento, use $ flag como ARRAY_FILTER_USE_KEY . Si desea enviar claves y valores, debe usar $ flag como ARRAY_FILTER_USE_BOTH .
Por ejemplo: considere una matriz simple
Si desea filtrar la matriz en función de la clave de la matriz , necesitamos usar ARRAY_FILTER_USE_KEY como tercer parámetro de la función de matriz array_filter.
Si desea filtrar la matriz en función de la clave de la matriz y el valor de la matriz , necesitamos utilizar ARRAY_FILTER_USE_BOTH como tercer parámetro de la función de matriz array_filter.
Funciones de devolución de llamada de muestra:
Saldrá
fuente
Con esta función puede filtrar una matriz multidimensional
fuente
fuente
¿Solución ingenua y fea (pero parece ser más rápida)?
Solo probé esto en php 7.3.11, pero un bucle feo parece ejecutarse en aproximadamente un tercio del tiempo. Resultados similares en una matriz con unos pocos cientos de claves. Micro-optimización, probablemente no útil en RW, pero lo encontró sorprendente e interesante:
fuente
fuente