Réponses:
Soit vous itérez le tableau, en recherchant l'enregistrement particulier (ok dans une recherche unique), soit vous 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 cette dernière - Référence du tableau PHP par plusieurs index
isset($item)
mais je préfère initialiser correctement les variables
if($v == $struct["ID"]){...
YurkamTim a raison. Il n'a besoin que d'une modification:
Après la fonction ($), vous avez besoin d'un pointeur vers la variable externe par "use (& $ viewedValue)" et vous pouvez ensuite accéder à la variable externe. Vous pouvez également le modifier.
$neededObject = array_filter(
$arrayOfObjects,
function ($e) use (&$searchedValue) {
return $e->id == $searchedValue;
}
);
&
n'est pas requis lors de l'importation $searchedValue
dans l'étendue de fermeture. Le &
est utilisé pour créer une référence qui n'est nécessaire que si elle $searchedValue
a été modifiée à l'intérieur de la fermeture.
global
que la seule utilisation était de partager des données dans des fonctions! Mais c'est dommage si c'est vraiment lent. :(
$arr = [
[
'ID' => 1
]
];
echo array_search(1, array_column($arr, 'ID')); // prints 0 (!== false)
J'ai trouvé une solution plus élégante ici . Adapté à la question, il peut ressembler à:
$neededObject = array_filter(
$arrayOfObjects,
function ($e) use ($searchedValue) {
return $e->id == $searchedValue;
}
);
array_filter
renvoie un tableau et ne s'arrête pas à la première valeur trouvée.
$searchedValue
à l'intérieur de la fonction. Mais à l'extérieur c'est.
$searchedValue
dehors de la portée de fermeture. Deuxièmement, comment pensez-vous que ces méthodes de tableau fonctionnent? Ils font tous une boucle sur le tableau en interne
$searchedValue
need writefunction ($e) use ($searchedValue) {
L'utilisation de array_column pour réindexer vous fera gagner du temps si vous devez rechercher plusieurs fois:
$lookup = array_column($arr, NULL, 'id'); // re-index by 'id'
Ensuite, vous pouvez simplement $lookup[$id]
à volonté.
class ArrayUtils
{
public static function objArraySearch($array, $index, $value)
{
foreach($array as $arrayInf) {
if($arrayInf->{$index} == $value) {
return $arrayInf;
}
}
return null;
}
}
L'utiliser comme vous le souhaitez serait quelque chose comme:
ArrayUtils::objArraySearch($array,'ID',$v);
Essayer
$entry = current(array_filter($array, function($e) use($v){ return $e->ID==$v; }));
exemple de travail ici
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)
après les paramètres de la fonction function ($e) HERE
.
la array_filter
fonction ne retourne que $neededObject
si la condition au retour esttrue
Si $searchedValue
est une chaîne ou un 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
c'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
var_dump($neededObject);
:)
J'aime parfois utiliser la fonction array_reduce () pour effectuer la recherche. C'est similaire à array_filter () mais n'affecte pas le tableau recherché, vous permettant d'effectuer plusieurs recherches 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): ";
}
if ($current_item->someProperty == $needle){ $result_array[] = $current_item; }
Je l'ai fait avec une sorte de keymap Java. Si vous faites cela, vous n'avez pas besoin de faire une boucle sur 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'];
production:
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
J'ai publié ce que j'utilise pour résoudre ce problème très efficacement ici en utilisant un algorithme de recherche binaire rapide: https://stackoverflow.com/a/52786742/1678210
Je ne voulais pas copier la même réponse. Quelqu'un d'autre l'avait demandé légèrement différemment mais la réponse est la même.