2010-07-29 10 views
121

Ho un array associativo e ho bisogno di trovare la posizione numerica di un tasto. È possibile scorrere manualmente l'array per trovarlo, ma esiste un modo migliore di integrarlo in PHP?php - ottieni l'indice numerico dell'array associativo

$a = array(
    'blue' => 'nice', 
    'car' => 'fast', 
    'number' => 'none' 
); 

// echo (find numeric index of $a['car']); // output: 1 

risposta

201
echo array_search("car",array_keys($a)); 
+2

PHP garantisce l'ordine di un array associativo? –

+4

@KevinBurke Non verrà riordinato a meno che non si usi una funzione di ordinamento. Non sei sicuro del tipo di garanzia che stai cercando, ma non è come il modello JavaScript in cui non esiste un ordine statico per gli array associativi. – Fosco

+4

Gli indici forniti da "array_keys" non corrispondono necessariamente all'indice dell'array originale. Ad esempio, se hai modificato l'array usando "unset" o un numero di altre funzioni, rimarrà un intervallo nell'indice dell'array originale, ma array_keys produrrà un nuovo array. – SEoF

0

una soluzione mi è venuta ... probabilmente abbastanza inefficiente rispetto tho soluzione di Fosco:

protected function getFirstPosition(array$array, $content, $key = true) { 

    $index = 0; 
    if ($key) { 
    foreach ($array as $key => $value) { 
    if ($key == $content) { 
    return $index; 
    } 
    $index++; 
    } 
    } else { 
    foreach ($array as $key => $value) { 
    if ($value == $content) { 
    return $index; 
    } 
    $index++; 
    } 
    } 
} 
+2

Sì, PHP ha migliaia di funzioni integrate per un motivo. Questi sono * di solito * molto più veloci della logica equivalente scritta a lungo nel codice PHP. –

+3

Questo è probabilmente più veloce di 'array_search', che fa un primo ordinamento e quindi rallenta dolorosamente. – Alasdair

+0

Ah, ma il codice integrato è precompilato e la ricerca sarà molto probabilmente una ricerca binaria (supponendo che faccia prima gli elementi di ordinamento). – SEoF

1

    $a = array(
     'blue' => 'nice', 
     'car' => 'fast', 
     'number' => 'none' 
); 
var_dump(array_search('car', array_keys($a))); 
var_dump(array_search('blue', array_keys($a))); 
var_dump(array_search('number', array_keys($a))); 
 
3
function arrayValuePosition($value, $array) 
{ 
    return array_search($value, array_keys($array)); 
} 
0

Mentre la risposta di Fosco non è sbagliata, c'è un caso da considerare con questo: matrici miste. Immaginate Ho un array come questo:

$a = array(
    "nice", 
    "car" => "fast", 
    "none" 
); 

Ora, PHP permette questo tipo di sintassi, ma ha un problema: se corro il codice di Fosco ottengo 0che è sbagliato per me, ma perché questo accade?
Perché quando si fa il confronto tra stringhe e interi PHP converte le stringhe in numeri interi (e questo è un pò stupida a mio parere), in modo che quando array_search() ricerche per l'indice si ferma al primo perché a quanto pare ("car" == 0)vale.
L'impostazione di array_search() in modalità rigorosa non risolverà il problema, poiché in tal caso array_search("0", array_keys($a)) restituirà false anche se esiste un elemento con indice 0.
Quindi la mia soluzione solo converte tutti gli indici da array_keys() alle corde e poi li confronta in modo corretto:

echo array_search("car", array_map("strval", array_keys($a))); 

Stampe 1 che è corretto

+0

Quando si passa una variabile, si dovrebbe anche lanciarla come una stringa, poiché il passaggio di zero a un array associativo avrebbe lo stesso effetto negativo. Ad esempio: 'var_dump (array_search (0, array_map (" strval ", array_keys ($ a))));' restituirà sempre 'int (0)', piuttosto che 'bool (false)'. –

Problemi correlati