214 votes

Comment trouver une entrée par propriété d'objet à partir d'un tableau d'objets ?

Le tableau ressemble à ça :

[0] => stdClass Object
        (
            [ID] => 420
            [name] => Mary
         )

[1] => stdClass Object
        (
            [ID] => 10957
            [name] => Blah
         )
...

Et j'ai une variable entière appelée $v .

Comment pourrais-je sélectionner une entrée de tableau qui a un objet où l'option ID a la propriété $v valeur ?

211voto

Phil Points 48960

Vous pouvez soit itérer le tableau, en recherchant l'enregistrement particulier (ce qui est acceptable pour une recherche unique), soit construire une table de hachage en utilisant un autre tableau associatif.

Pour le premier, quelque chose comme ceci

$item = null;
foreach($array as $struct) {
    if ($v == $struct->ID) {
        $item = $struct;
        break;
    }
}

Voir cette question et les réponses suivantes pour plus d'informations sur ce dernier point. Référence à un tableau PHP par plusieurs index

3 votes

Il n'est pas nécessaire de mettre $item à null.

35 votes

Oups, c'est là :) C'est au cas où l'élément recherché ne se trouve pas dans le tableau. Alternativement, vous pouvez utiliser isset($item) mais je préfère initialiser les variables correctement

3 votes

F if($v == $struct["ID"]){...

102voto

Tim Points 654
$arr = [
  [
    'ID' => 1
  ]
];

echo array_search(1, array_column($arr, 'ID')); // prints 0 (!== false)

Le code ci-dessus fait écho à la indice de l'élément correspondant, ou false s'il n'y en a pas.

Pour obtenir l'élément correspondant, faites quelque chose comme :

$i = array_search(1, array_column($arr, 'ID'));
$element = ($i !== false ? $arr[$i] : null);

tableau_colonne fonctionne à la fois sur un tableau de tableaux et sur un tableau d'objets.

77voto

Daniel Hardt Points 98

YurkamTim a raison. Cela nécessite seulement une modification: (désolé je ne peux pas commenter maintenant)

after function ($), vous avez besoin d’un pointeur sur la variable externe avec "use (& $ searchValue)" pour pouvoir ensuite accéder à la variable externe. Aussi, vous pouvez le modifier.

 $neededObject = array_filter(
    $arrayOfObjects,
    function ($e) use (&$searchedValue) {
        return $e->id == $searchedValue
    }
);
 

3 votes

Vous avez raison au sujet de la modification et c'est une méthode assez soignée, mais j'ai testé la vitesse par rapport à l'itération à travers l'objet - vous-même, parce que comme @phil l'a souligné, array_filter le fait aussi - et cette méthode prend environ cinq fois plus de temps. Mon objet de test n'est pas très grand, donc cela pourrait être encore pire.

12 votes

El & n'est pas nécessaire lors de l'importation $searchedValue dans la portée de la fermeture. Le site & est utilisé pour créer une référence qui est seulement nécessaire si $searchedValue a été modifié à l'intérieur de la fermeture.

0 votes

C'est cool. Je ne savais pas que PHP pouvait faire des choses comme ça. Je pensais qu'en utilisant global était le seul moyen de partager des données dans les fonctions ! Mais c'est dommage si c'est effectivement lent :(

38voto

YurkaTim Points 81

J'ai trouvé une solution plus élégante aquí . Adapté à la question, cela peut ressembler à ceci :

$neededObject = array_filter(
    $arrayOfObjects,
    function ($e) use ($searchedValue) {
        return $e->id == $searchedValue;
    }
);

21 votes

+1 mais array_filter renvoie un tableau, et ne s'arrêtera pas à la première valeur trouvée.

0 votes

Eh bien, cela dépend ;) si j'ai un tableau de quelques éléments, je préférerais array_filter à une boucle faite à la main, étant donné que c'est une fonction php intégrée.

4 votes

Il ne reconnaît pas $searchedValue à l'intérieur de la fonction. Mais à l'extérieur, oui.

30voto

tennenrishin Points 453

Utilisation de tableau_colonne pour réindexer vous fera gagner du temps si vous devez effectuer plusieurs recherches :

$lookup = array_column($arr, NULL, 'id');   // re-index by 'id'

Vous pouvez alors simplement $lookup[$id] à volonté.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X