Pregunta

Quiero hacer algo aparentemente muy simple, pero no encuentro nada al respecto:simplemente extraiga un subconjunto de una matriz similar a array_splice, pero usando claves para recuperar los valores :

$data = array('personName' => 'John', 'personAge' => 99, 'personId' => 1,  
              /* many more data I don't need here ... */);

list($name, $age, $id) = array_splice_by_keys($data,
                          array('personName', 'personAge', 'personId');

Si todo lo demás falla, ¿no existe una función incorporada para filtrar una matriz asociativa por claves?Por ejemplo:

$filteredArray = array__extract__keys__and__values($srcArray, $arrayOfWantedKeys);

// create a new array with ONLY those key => values I need
$wanted_values = array_extract_keys_and_values($data,
                  array('personName', 'personAge', 'personId');

echo $wanted_values['personName'];  

Supongo que la razón por la que quiero hacer el primero es que no me gusta repetir el acceso asociativo a la matriz en todo mi código, parecería mejor optimizar copiar los valores que se usan mucho (en un bucle, por ejemplo). ), en una variable local, además es mucho más fácil escribir $nombre que $somearray['nombre'].

EDITAR:Gracias, supongo que para usar con la lista, la solución sería

list($x, $y, $z) = array_values(array_intersect_key($array, array_flip($wantedKeys)));

¡Uso interesante de array_flip!

¿Fue útil?

Solución

en la versión PHP> = 5.1.0 se puede utilizar array_intersect_key :

$data = array('personName' => 'John', 'personAge' => 99, 'personId' => 1,  
          'test' => 23);
$ex = array('personName'=>0, 'personAge'=>0, 'personId'=>0);
var_dump(array_intersect_key($data, $ex));

Los valores en $ex no importan, sólo tienen que estar presentes.

Otros consejos

Esta es esencialmente la misma que la respuesta de SilentGhost pero esto podría ser más fácil, y probablemente un poco más lento.

array_intersect_key($array, array_flip($wantedKeys));
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top