Extraire un sous-ensemble de valeurs d'un tableau associatif (php)
-
05-09-2019 - |
Question
Je veux faire quelque chose qui semble très simple, mais je ne trouve rien à ce sujet :extrayez simplement un sous-ensemble d'un tableau similaire à array_splice, mais utiliser des clés pour récupérer les valeurs :
$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'existe-t-il pas une fonction intégrée pour filtrer un tableau associatif par 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, c'est que je n'aime pas répéter l'accès aux tableaux associatifs partout dans mon code, il semblerait mieux optimisé pour copier les valeurs qui sont beaucoup utilisées (dans une boucle par exemple ), dans une variable locale, et il est également beaucoup plus facile de taper $name que $somearray['name'].
MODIFIER:Merci, je suppose que pour une utilisation avec list, la solution serait
list($x, $y, $z) = array_values(array_intersect_key($array, array_flip($wantedKeys)));
Utilisation intéressante de array_flip !
La solution
dans la version php >= 5.1.0, vous 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 dans $ex
peu importe, ils doivent juste être présents.
Autres conseils
C'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));