2010-03-12 29 views
7

Ho una matrice all'interno di una matrice.php Verifica se il valore esiste nella matrice dell'array

$a = array (0 => array ('value' => 'America',), 1 => array ('value' => 'England',),) 

Come verificare se "America" ​​è presente nell'array? L'array America potrebbe essere una chiave e ci potrebbe essere un numero qualsiasi di sottotitoli, quindi una soluzione generalizzata per favore.

Guardando il manuale php, vedo in_array, ma funziona solo per il livello superiore. quindi qualcosa come in_array("America", $a) non funzionerebbe.

Grazie.

+1

Se tutti gli array contengono solo un valore, perché li stai mettendo in array? Perché non solo il valore assegnato a quella chiave? – animuson

+0

Lo script cercherà solo una o forse una piccola quantità di elementi in un grande array multidimensionale? O sarà alla ricerca di molti elementi che potrebbero rendere "più economico" creare un hashtable/array piatto di tutti gli elementi prima della ricerca? – VolkerK

+0

Scusa, c'erano più valori negli array, ho cercato di semplificarlo per la domanda, immagino che sia fallito. – Mark

risposta

11

Una soluzione generale sarebbe:

function deep_in_array($needle, $haystack) { 
    if(in_array($needle, $haystack)) { 
     return true; 
    } 
    foreach($haystack as $element) { 
     if(is_array($element) && deep_in_array($needle, $element)) 
      return true; 
    } 
    return false; 
} 

Il motivo per cui ho scelto di utilizzare in_arraye un ciclo è: Prima di esaminare i livelli più profondi della struttura a matrice, faccio in modo che il valore ricercato non è al livello attuale. In questo modo, spero che il codice sia più veloce di un qualche tipo di metodo di ricerca con profondità.


Naturalmente se la matrice è sempre 2 dimensionale e si desidera solo la ricerca in questo tipo di array, allora questo è più veloce:

function in_2d_array($needle, $haystack) { 
    foreach($haystack as $element) { 
     if(in_array($needle, $element)) 
      return true; 
    } 
    return false; 
} 
+0

modo di goooo !! –

+0

Penso che il 'return' dopo' if (is_array ...) 'sia problematico. Non puoi fare un ritorno per ogni elemento. Invece dovresti tornare solo se la chiamata a 'deep_in_array' restituisce true. – middus

+0

Il mio array è sempre bidimensionale. Adoro come entrambe le risposte si chiamino felix. :) La tua seconda opzione è più veloce di quella dell'altro gatto? – Mark

5

PHP non dispone di una funzione nativa array_search_recursive(), ma è possibile definirne uno:

function array_search_recursive($needle, $haystack) { 
    foreach ($haystack as $value) { 
     if (is_array($value) && array_search_recursive($needle, $value)) return true; 
     else if ($value == $needle) return true; 
    } 
    return false; 
} 

Non testato ma si ottiene l'idea.

+0

Hey Felix;) Potrebbe essere più veloce della mia perché attraversi la matrice solo una volta. Dall'altro lato si esamineranno sempre prima gli array anche se il valore di ricerca potrebbe già esistere nel livello corrente dell'array. –

0
function search($a,$searchval){ //$a - array; $searchval - search value; 
if(is_array($a)) { 
foreach($a as $val){ 
if(is_array($val)) 
if(in_array($searchval,$val)) return true; 
} 
} 
else return false; 
} 

search($a, 'America'); //function call 
Problemi correlati