2009-02-20 6 views
12

Je veux faire quelque chose qui semble très simple, mais je ne trouve rien: extraire simplement un sous-ensemble d'un tableau similaire à array_splice, mais en utilisant les touches pour récupérer les valeurs:Extraire un sous-ensemble de valeurs d'un tableau associatif (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 tout le reste échoue, n'est pas là une fonction builtin pour filtrer un tableau associatif par les clés? Par exemple:

$ 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']; 

Je suppose que la raison pour laquelle je veux faire le premier, est que je ne veux pas répéter accès au tableau associatif tout mon code, il semble mieux optimisé pour copier les valeurs utilisées beaucoup (dans une boucle par exemple), dans une variable locale, plus il est beaucoup plus facile de taper $ name que $ somearray ['nom'].

EDIT: Merci, je suppose que pour une utilisation avec la liste, la solution serait

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

Intesresting utilisation de array_flip!

Répondre

7

en version php> = 5.1.0 pouvez utiliser 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)); 

valeurs $ex ne comptent pas, ils ont juste à être présents.

27

Ceci est essentiellement la même chose que la réponse de SilentGhost mais cela pourrait être plus facile, et probablement un peu plus lent.

array_intersect_key($array, array_flip($wantedKeys)); 
Questions connexes