Risposte:
Puoi iterare l'array, cercare il record particolare (ok in una sola ricerca) o creare una hashmap usando un altro array associativo.
Per il primo, qualcosa del genere
$item = null;
foreach($array as $struct) {
if ($v == $struct->ID) {
$item = $struct;
break;
}
}
Vedere questa domanda e le risposte successive per ulteriori informazioni su quest'ultimo: riferimento PHP array per più indici
isset($item)
ma preferisco inizializzare correttamente le variabili
if($v == $struct["ID"]){...
YurkamTim ha ragione. Ha solo bisogno di una modifica:
Dopo la funzione ($) è necessario un puntatore alla variabile esterna tramite "use (& $earchValue)" e quindi è possibile accedere alla variabile esterna. Inoltre puoi modificarlo.
$neededObject = array_filter(
$arrayOfObjects,
function ($e) use (&$searchedValue) {
return $e->id == $searchedValue;
}
);
&
è richiesto durante l'importazione $searchedValue
nell'ambito di chiusura. La &
viene utilizzato per creare un riferimento che è necessaria solo se $searchedValue
è stato modificato all'interno della chiusura.
global
fosse l'unico modo per condividere i dati nelle funzioni! Ma è un peccato se questo è davvero lento. :(
$arr = [
[
'ID' => 1
]
];
echo array_search(1, array_column($arr, 'ID')); // prints 0 (!== false)
Ho trovato una soluzione più elegante qui . Adattato alla domanda potrebbe apparire come:
$neededObject = array_filter(
$arrayOfObjects,
function ($e) use ($searchedValue) {
return $e->id == $searchedValue;
}
);
array_filter
restituisce un array e non si fermerà al primo valore trovato.
$searchedValue
all'interno della funzione. Ma fuori lo è.
$searchedValue
rientra nell'ambito di chiusura. In secondo luogo, come pensi che funzionino questi metodi di array? Tutti fanno un giro sull'array internamente
$searchedValue
bisogno scrivifunction ($e) use ($searchedValue) {
L'uso di array_column per reindicizzare ti farà risparmiare tempo se devi trovarlo più volte:
$lookup = array_column($arr, NULL, 'id'); // re-index by 'id'
Allora puoi semplicemente $lookup[$id]
a piacimento.
class ArrayUtils
{
public static function objArraySearch($array, $index, $value)
{
foreach($array as $arrayInf) {
if($arrayInf->{$index} == $value) {
return $arrayInf;
}
}
return null;
}
}
Usarlo nel modo desiderato sarebbe qualcosa del tipo:
ArrayUtils::objArraySearch($array,'ID',$v);
Provare
$entry = current(array_filter($array, function($e) use($v){ return $e->ID==$v; }));
esempio funzionante qui
Risolvendo un piccolo errore di @YurkaTim , la tua soluzione funziona per me ma aggiungendo use
:
Per utilizzare $searchedValue
, all'interno della funzione, una soluzione può essere use ($searchedValue)
dopo i parametri della funzionefunction ($e) HERE
.
la array_filter
funzione ritorna solo $neededObject
se la condizione al ritorno ètrue
Se $searchedValue
è una stringa o un numero intero:
$searchedValue = 123456; // Value to search.
$neededObject = array_filter(
$arrayOfObjects,
function ($e) use ($searchedValue) {
return $e->id == $searchedValue;
}
);
var_dump($neededObject); // To see the output
Se $searchedValue
è un array in cui è necessario verificare con un elenco:
$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);
:)
A volte mi piace usare la funzione array_reduce () per eseguire la ricerca. È simile a array_filter () ma non influisce sull'array cercato, consentendoti di effettuare più ricerche sullo stesso array di oggetti.
$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; }
L'ho fatto con una sorta di keymap Java. In tal caso, non è necessario eseguire il loop sull'array di oggetti ogni volta.
<?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'];
produzione:
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
Ho pubblicato quello che uso per risolvere questo problema in modo efficiente qui utilizzando un rapido algoritmo di ricerca binaria: https://stackoverflow.com/a/52786742/1678210
Non volevo copiare la stessa risposta. Qualcun altro l'aveva chiesto in modo leggermente diverso, ma la risposta è la stessa.