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
?
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
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;
}
);
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);
$arr = [
[
'ID' => 1
]
];
echo array_search(1, array_column($arr, 'ID')); // prints 0 (!== false)
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é.
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): ";
}
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
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