PHP - trouver l'entrée par propriété d'objet à partir d'un tableau d'objets

le tableau ressemble à:

[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 puis-je sélectionner une entrée de tableau qui a un objet dont la propriété 'ID' a la valeur $v ?

107
demandé sur Alex 2011-01-20 05:24:39

9 réponses

soit vous itérez le tableau, en cherchant l'enregistrement particulier (ok dans une recherche unique) ou construisez un hashmap en utilisant un autre tableau associatif.

pour le premier, quelque chose comme ça

$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 - tableau PHP de référence par index multiples

138
répondu Phil 2017-05-23 12:26:26

YurkamTim est juste. Il n'a besoin que d'une modification: (Désolé Je ne peux pas commenter maintenant).

après la fonction($) vous avez besoin d'un pointeur vers la variable externe par" use(&$searchedValue) " et ensuite vous pouvez accéder à la variable externe. Vous pouvez aussi le modifier.

$neededObject = array_filter(
    $arrayOfObjects,
    function ($e) use (&$searchedValue) {
        return $e->id == $searchedValue;
    }
);
50
répondu Daniel Hardt 2017-05-23 12:34:41

j'ai trouvé une solution plus élégante ici . Adapté à la question, il peut ressembler à:

$neededObject = array_filter(
    $arrayOfObjects,
    function ($e) {
        return $e->id == $searchedValue;
    }
);
19
répondu YurkaTim 2017-11-20 09:03:52
class ArrayUtils
{
    public static function objArraySearch($array, $index, $value)
    {
        foreach($array as $arrayInf) {
            if($arrayInf->{$index} == $value) {
                return $arrayInf;
            }
        }
        return null;
    }
}

utiliser la façon dont vous vouliez serait quelque chose comme:

ArrayUtils::objArraySearch($array,'ID',$v);
8
répondu Pablo S G Pacheco 2015-11-16 17:45:51
$arr = [
  [
    'ID' => 1
  ]
];

echo array_search(1, array_column($arr, 'ID')); // prints 0 (!== false)
6
répondu Tim 2017-03-27 11:14:27

L'utilisation de array_column pour re-indexer permettra de gagner du temps si vous avez besoin de trouver plusieurs fois:

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

, Alors vous pouvez simplement $lookup[$id] à volonté.

4
répondu Museful 2017-05-24 20:29:16

j'aime parfois utiliser la fonction array_reduce () pour effectuer la recherche. Il est similaire à array_filter() mais n'affecte pas le tableau recherché, vous permettant d'effectuer des recherches multiples 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): ";
}
2
répondu yuvilio 2017-02-28 22:00:16

réparer une petite erreur du @YurkaTim , votre solution travaille pour moi mais en ajoutant use :

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

la fonction array_filter ne retourne que la fonction $neededObject la condition de retour est true

si $searchedValue est une chaîne ou entier:

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

Si $searchedValue est tableau où nous avons besoin de 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($searchedValue); // To see the output
2
répondu Jose Carlos Ramos Carmenates 2017-05-23 12:10:27

j'ai fait ça avec une sorte de keymap Java. Si vous faites cela, vous n'avez pas besoin de boucler votre tableau d'objets à chaque fois.

<?php

//This is your array with objects
$object1 = (object) array('id'=>123,'name'=>'Henk','age'=>65);
$object2 = (object) array('id'=>273,'name'=>'Koos','age'=>25);
$object3 = (object) array('id'=>685,'name'=>'Bram','age'=>75);
$firstArray = Array($object1,$object2);
var_dump($firstArray);

//create a new array
$secondArray = Array();
//loop over all objects
foreach($firstArray as $value){
    //fill second        key          value
    $secondArray[$value->id] = $value->name;
}

var_dump($secondArray);

echo $secondArray['123'];

sortie:

array (size=2)
  0 => 
    object(stdClass)[1]
      public 'id' => int 123
      public 'name' => string 'Henk' (length=4)
      public 'age' => int 65
  1 => 
    object(stdClass)[2]
      public 'id' => int 273
      public 'name' => string 'Koos' (length=4)
      public 'age' => int 25
array (size=2)
  123 => string 'Henk' (length=4)
  273 => string 'Koos' (length=4)
Henk
1
répondu Mart-Jan 2016-01-07 10:03:25