php - ottiene l'indice numerico dell'array associativo


154

Ho un array associativo e devo trovare la posizione numerica di una chiave. Potrei fare un ciclo manuale dell'array per trovarlo, ma esiste un modo migliore per integrarlo in PHP?

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

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

Risposte:


273
echo array_search("car",array_keys($a));

5
PHP garantisce l'ordine di un array associativo?
Kevin Burke,

7
@KevinBurke Non lo riordinerà se non si utilizza 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,

6
Gli indici forniti da "array_keys" non corrisponderanno necessariamente all'indice dell'array originale. Ad esempio, se l'array è stato modificato utilizzando "unset" o un numero di altre funzioni, rimarrà uno spazio nell'indice dell'array originale, ma array_keys produrrà un nuovo array.
SEoF,

4
Questo NON funziona se la matrice associativa è mista, poiché array("val1", "val2", "car" => "val3")produrrà 0, il che è sbagliato ...
Xriuk

In che modo differisce dalla risposta di @ quantamSoup?
Mistico


2

  $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)));


2
function arrayValuePosition($value, $array)
{
    return array_search($value, array_keys($array));
}

2

Mentre la risposta di Fosco non è sbagliata, c'è un caso da considerare con questo: array misti. Immagina di avere un array come questo:

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

Ora, PHP consente questo tipo di sintassi ma ha un problema: se eseguo il codice di Fosco ottengo 0 quale è sbagliato per me, ma perché succede?
Perché quando si fa un confronto tra stringhe e numeri interi PHP converte le stringhe in numeri interi (e questo è un po 'stupido secondo me), quindi quando si array_search()cerca l'indice si ferma al primo perché apparentemente ("car" == 0) è vero .
L'impostazione array_search()in modalità rigorosa non risolverà il problema perché array_search("0", array_keys($a))restituirebbe false anche se esiste un elemento con indice 0.
Quindi la mia soluzione converte solo tutti gli indici da array_keys()in stringhe e poi li confronta correttamente:

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

Stampe 1, che è corretto.

EDIT:
Come ha sottolineato Shaun nel commento qui sotto, la stessa cosa si applica al valore dell'indice, se ti capita di cercare un indice int come questo:

$a = array(
  "foo" => "bar",
  "nice",
  "car" => "fast",
  "none"
);
$ind = 0;
echo array_search($ind, array_map("strval", array_keys($a)));

Otterrai sempre 0, il che è sbagliato, quindi la soluzione sarebbe quella di lanciare l'indice (se usi una variabile) su una stringa come questa:

$ind = 0;
echo array_search((string)$ind, array_map("strval", array_keys($a)));

1
Quando si passa una variabile, è necessario anche lanciarla come stringa, poiché passare zero a una matrice associativa avrebbe lo stesso effetto negativo. Ad esempio: var_dump(array_search(0, array_map("strval", array_keys($a))));verrà sempre emesso int (0), anziché bool (false).
Shaun Cockerill

@ShaunCockerill giusto! Aggiornato la mia risposta, grazie per averlo sottolineato!
Xriuk,

0

una soluzione che mi è venuta in mente ... probabilmente piuttosto inefficiente rispetto alla 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. Di solito sono molto più veloci della logica equivalente scritta nel lungo codice PHP.
Bill Karwin,

3
Questo è probabilmente più veloce di array_search, che fa prima una specie e quindi dolorosamente rallenta.
Alasdair,

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

0

Tutte le soluzioni basate su array_keys non funzionano per array misti. La soluzione è semplice:

echo array_search($needle,array_keys($haystack), true);

Da php.net: se il terzo parametro strict è impostato su TRUE, la funzione array_search () cercherà elementi identici nel pagliaio. Ciò significa che eseguirà anche un rigido confronto di tipo dell'ago nel pagliaio e gli oggetti devono essere la stessa istanza.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.