2012-09-05 8 views
5

I Ho una matrice che contiene più oggetti. È possibile verificare se esiste un valore in uno qualsiasi degli oggetti, ad es. id-> 27 senza looping? In modo simile alla funzione in_array() di PHP. Grazie.È possibile verificare se esiste un valore all'interno di un array pieno di oggetti senza loop?

> array(10)[0]=>Object #673 
        ["id"]=>25 
        ["name"]=>spiderman 
      [1]=>Object #674 
        ["id"]=>26 
        ["name"]=>superman 
      [2]=>Object #675 
        ["id"]=>27 
        ["name"]=>superman 
      ....... 
      ....... 
      ......... 

risposta

4

No. Se si spesso hanno bisogno di una rapida ricerca diretta dei valori, è necessario utilizzare i tasti dell'array per t orlo, che sono fulminei alla ricerca. Per esempio:

// prepare once 
$indexed = array(); 
foreach ($array as $object) { 
    $indexed[$object->id] = $object; 
} 

// lookup often 
if (isset($indexed[42])) { 
    // object with id 42 exists... 
} 

Se avete bisogno di ricercare oggetti chiavi diverse, in modo da poter in realtà non li indice da una chiave specifica, è necessario esaminare diverse strategie di ricerca come binary searches.

0

Si può fare:

foreach ($array as $value) 
{ 
    if ($value == "what you are looking for") 
     break; 
} 
+0

Senza loop? – Stu

+0

hai detto senza passare attraverso l'intero array – gorgi93

+1

Haha true. Cambierò in modo appropriato. – Stu

1

array_search - Ricerche l'array per un dato valore e restituisce il tasto corrispondente in caso di successo

$key = array_search('your search', $array); 
+1

Mentre è una buona funzione, non funzionerà per OP, perché ha bisogno di controllare un campo nei valori dell'array, non il valore stesso - e 'array_search' non accetta la funzione di confronto –

2

È necessario eseguire il looping in un modo o nell'altro, ma non è necessario implementarlo manualmente. Dai un'occhiata a array_filter function. Tutto quello che dovete fare è quello di fornire una funzione che controlla gli oggetti, qualcosa di simile:

function checkID($var) 
{ 
    return $var->id == 27; 
} 

if(count(array_filter($input_array, "checkID")) { 
    // you have at least one matching element 
} 

Oppure si può anche fare questo in una sola riga:

if(count(array_filter($input_array, function($var) { return $var->id == 27; })) { 
    // you have at least one matching element 
} 
+0

Questo è potenzialmente molto dispendioso, dal momento che non si interrompe una volta trovato il valore, ma scorre sempre attraverso tutti loro. – deceze

+0

@deceze Accetto. La domanda è quanto è grande il suo array. Se ha a che fare con milioni di oggetti, questo non andrà bene. Se la matrice contiene solo pochi elementi (anche poche centinaia), l'impatto sarà trascurabile. –

+0

'empty' non funziona sui valori restituiti dalla funzione, e non è necessario usarlo qui in ogni caso. Un puro confronto booleano va bene. – deceze

3
$results = array_filter($array, function($item){ 
    return ($item->id === 27); 
}); 
if ($results) 
{ 
    .. You have matches 
} 
+0

Non usare '! Empty ($ var)' quando si intende semplicemente '$ var'. – deceze

+0

Vostro diritto, modifico di conseguenza. –

Problemi correlati