2009-02-20 19 views
12

Quiero hacer algo aparentemente muy simple, pero no puedo encontrar nada al respecto: simplemente extraiga un subconjunto de una matriz similar a array_splice, pero usando claves para recuperar los valores:Extrayendo un subconjunto de valores de una matriz asociativa (php)

$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 es una función incorporada para filtrar una matriz asociativa con las teclas? 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 acceso a una matriz asociativa todo mi código, parecería mejor optimizado para copiar los valores que se utilizan mucho (en un bucle, por ejemplo), en una variable local, además de que es mucho más fácil escribir $ name que $ somearray ['name'].

EDIT: Gracias, supongo que para su uso con la lista, la solución sería

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

Intesresting uso de array_flip!

Respuesta

7

en php versión> = 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)); 

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

27

Esto es esencialmente lo mismo 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)); 
Cuestiones relacionadas