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 ?

17voto

Kamil Kiełczewski Points 6496

Essayez

$entry = current(array_filter($array, function($e) use($v){ return $e->ID==$v; }));

exemple de travail aquí

14voto

PabloKarzin Points 701
class ArrayUtils
{
    public static function objArraySearch($array, $index, $value)
    {
        foreach($array as $arrayInf) {
            if($arrayInf->{$index} == $value) {
                return $arrayInf;
            }
        }
        return null;
    }
}

L'utiliser de la façon dont vous le souhaitez serait quelque chose comme :

ArrayUtils::objArraySearch($array,'ID',$v);

7voto

josecarlos Points 746

Correction d'une petite erreur du @YurkaTim votre solution fonctionne pour moi mais en ajoutant use :

Pour utiliser $searchedValue à l'intérieur de la fonction, une solution peut être use ($searchedValue) paramètres de la fonction après function ($e) HERE .

le site array_filter retourne uniquement sur $neededObject le si la condition au retour est true

Si $searchedValue est une chaîne de caractères ou un nombre entier :

$searchedValue = 123456; // Value to search.
$neededObject = array_filter(
    $arrayOfObjects,
    function ($e) use ($searchedValue) {
        return $e->id == $searchedValue;
    }
);
var_dump($neededObject); // To see the output

Si $searchedValue est un tableau où nous devons vérifier avec une liste :

$searchedValue = array( 1, 5 ); // Value to search.
$neededObject  = array_filter(
    $arrayOfObjects,
    function ( $e ) use ( $searchedValue ) {
        return in_array( $e->term_id, $searchedValue );
    }
);
var_dump($neededObject); // To see the output

3voto

yuvilio Points 1123

J'aime parfois utiliser le array_reduce() pour effectuer la recherche. Elle est similaire à array_filter() mais n'affecte pas le tableau recherché, ce qui vous permet d'effectuer les opérations suivantes multiple sur le même tableau d'objets.

$haystack = array($obj1, $obj2, ...); //some array of objects
$needle = 'looking for me?'; //the value of the object's property we want to find

//carry out the search
$search_results_array = array_reduce(
  $haystack,

  function($result_array, $current_item) use ($needle){
      //Found the an object that meets criteria? Add it to the the result array 
      if ($current_item->someProperty == $needle){
          $result_array[] = $current_item;
      }
      return $result_array;
  },
  array() //initially the array is empty (i.e.: item not found)
);

//report whether objects found
if (count($search_results_array) > 0){
  echo "found object(s): ";
  print_r($search_results_array[0]); //sample object found
} else {
  echo "did not find object(s): ";
}

2voto

user1414555 Points 56

Une façon d'obtenir instantanément la première valeur :

$neededObject = array_reduce(
    $arrayOfObjects,
    function ($result, $item) use ($searchedValue) {
        return $item->id == $searchedValue ? $item : $result;
    }
);

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