J'ai un tableau d'objets chats:
$cats = Array
(
[0] => stdClass Object
(
[id] => 15
),
[1] => stdClass Object
(
[id] => 18
),
[2] => stdClass Object
(
[id] => 23
)
)
et je veux extraire un tableau d'identifiants de chats en 1 ligne (pas une fonction ni une boucle).
Je pensais utiliser array_walk
avec create_function
mais je ne sais pas comment faire.
Une idée?
Réponses:
Si vous avez PHP 5.5 ou version ultérieure , le meilleur moyen est d'utiliser la fonction intégrée
array_column()
:Mais le fils doit être un tableau ou converti en un tableau
la source
array_column
ne fonctionne pas du tout avec unarray
deobject
s. Depuis PHP 7.0.0 est possible: stackoverflow.com/a/23335938/655224Vous pouvez utiliser la
array_map()
fonction.Cela devrait le faire:
la source
$project_names = array_map(function($project) { return $project->name ;}, $projects );
Cependant, il est noté dans ce billet de blog que cela pourrait être 2,5 fois plus lent / gourmand en mémoire de cette façon.create_function
la mémoire, elle grandit. Si vous écrivez un programme avec des boucles infinies et appelez learray_map
aveccreate_function
, vous obtiendrez toujours uneOut of memory...
erreur parfois. Alors n'utilisez pascreate_function
et n'utilisez pasarray_map(function($o) { return $o->id; }, $objects);
La solution dépend de la version PHP que vous utilisez. Au moins il y a 2 solutions:
First (versions PHP plus récentes)
Comme @JosepAlsina l'a dit avant, la solution la meilleure et la plus courte consiste à utiliser
array_column
comme suit:Remarque: Pour itérer un
array
contenant\stdClass
es tel qu'utilisé dans la question, cela n'est possible qu'avec les versions PHP>= 7.0
. Mais lorsque vous utilisez unarray
contenantarray
s, vous pouvez faire la même chose depuis PHP>= 5.5
.Deuxième (anciennes versions de PHP)
@Greg a déclaré que dans les anciennes versions de PHP, il est possible de faire ce qui suit:
Mais attention: dans les nouvelles versions de PHP,
>= 5.3.0
il est préférable d'utiliserClosure
s, comme suit:La différence
La première solution crée une nouvelle fonction et la met dans votre RAM. Le garbage collector ne supprime pas l'instance de fonction déjà créée et déjà appelée de la mémoire pour une raison quelconque. Et cela indépendamment du fait, que l'instance de fonction créée ne peut plus jamais être appelée, car nous n'avons pas de pointeur pour elle. Et la prochaine fois que ce code sera appelé, la même fonction sera à nouveau créée. Ce comportement remplit lentement votre mémoire ...
Les deux exemples avec sortie mémoire pour les comparer:
MAUVAIS
BIEN
Cela peut également être discuté ici
Fuite de mémoire?! Garbage Collector fonctionne-t-il correctement lors de l'utilisation de 'create_function' dans 'array_map'?
la source
array_column
sur ce tableau, il retourne toujours vide alors que CET extrait fonctionne correctement, les deux ont la propriété protégée qui est accessible dans le deuxième extrait seulement. Je n'ai trouvé aucune autre raison que l'espace de noms.object
dans ma solution, jeobject
ne veux pas dire unObject
. Le minusculeobject
décrit l'objet simple\stdClass
. C'est peut-être là le problème. Avez-vousObject
unetoArray
méthode? Utilisez ceci. Un simpleobject
et unarray
sont presque les mêmes. Invariant suivant doit être valide:((object)(array)$o) === $o
. Lors de l'implémentation de la__get
méthode, vous rendrez les propriétés de votre classe accessibles à tous. Cela peut être le comportement attendu. Mais vous pouvez également parcourir votrearray<Object>
exemple avecarray_map
et appelertoArray
(s'il existe), puis cela fonctionne égalementet utilisez-le en une seule ligne :
la source
array_walk
.CODE
PRODUCTION
Je sais qu'il utilise une boucle, mais c'est le moyen le plus simple de le faire! Et en utilisant une fonction, il se termine toujours sur une seule ligne.
la source
Vous pouvez le faire facilement avec des goodies ouzo
ou avec des tableaux (à partir de goodies ouzo)
Consultez: http://ouzo.readthedocs.org/en/latest/utils/functions.html#extract
Voir aussi programmation fonctionnelle avec ouzo (je ne peux pas poster de lien).
la source
Les boucles intégrées en PHP sont plus rapides que les boucles interprétées, il est donc logique de faire de celle-ci une ligne unique:
la source
la source
Sortie : [1, 2]
la source
La
create_function()
fonction est obsolète à partir de php v7.2.0 . Vous pouvez utiliserarray_map()
comme indiqué,Vous pouvez également utiliser une
array_column()
fonction qui renvoie les valeurs d'une seule colonne de l'entrée, identifiée par la clé_colonne. Facultativement, un index_key peut être fourni pour indexer les valeurs dans le tableau retourné par les valeurs de la colonne index_key du tableau d'entrée. Vous pouvez utiliser le array_column comme indiqué,la source