php - Ermittelt den numerischen Index des assoziativen Arrays

154

Ich habe ein assoziatives Array und muss die numerische Position eines Schlüssels finden. Ich könnte das Array manuell durchlaufen, um es zu finden, aber gibt es eine bessere Möglichkeit, PHP zu integrieren?

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

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

Antworten:

272
echo array_search("car",array_keys($a));
Fosco
quelle
5
Garantiert PHP die Reihenfolge eines assoziativen Arrays?
Kevin Burke
7
@ KevinBurke Es wird nicht nachbestellt, es sei denn, Sie verwenden eine Sortierfunktion. Sie sind sich nicht sicher, nach welcher Art von Garantie Sie suchen, aber es ist nicht wie beim JavaScript-Modell, bei dem assoziative Arrays keine statische Reihenfolge haben.
Fosco
6
Die durch "array_keys" angegebenen Indizes stimmen nicht unbedingt mit dem Index des ursprünglichen Arrays überein. Wenn Sie beispielsweise das Array mit "unset" oder einer Reihe anderer Funktionen geändert haben, bleibt eine Lücke im Index des ursprünglichen Arrays, aber array_keys erzeugt ein neues Array.
SEoF
4
Dies funktioniert NICHT, wenn das assoziative Array gemischt ist, da array("val1", "val2", "car" => "val3")es erzeugt 0, was falsch ist ...
Xriuk
Wie unterscheidet sich das von der Antwort
Mystisch
35
$blue_keys = array_search("blue", array_keys($a));

http://php.net/manual/en/function.array-keys.php

quantumSoup
quelle
8
+1 ersparte mir 5 Momente bei der Google-Suche nach der Funktion, mit der ich diesen Kommentar eingegeben habe.
Aditya MP
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)));

Asterión
quelle
2
function arrayValuePosition($value, $array)
{
    return array_search($value, array_keys($array));
}
Andrey Vorobyev
quelle
2

Während die Antwort von Fosco nicht falsch ist, gibt es einen Fall, der bei diesem berücksichtigt werden muss : gemischte Arrays. Stellen Sie sich vor, ich habe ein Array wie dieses:

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

PHP erlaubt diese Art von Syntax, hat aber ein Problem: Wenn ich den Code von Fosco ausführe, erhalte ich 0 den für mich falschen , aber warum passiert das?
Denn wenn PHP Vergleiche zwischen Zeichenfolgen und Ganzzahlen durchführt, konvertiert es Zeichenfolgen in Ganzzahlen (und das ist meiner Meinung nach ein bisschen dumm). Wenn also array_search()nach dem Index gesucht wird, stoppt es beim ersten, weil es anscheinend ("car" == 0) wahr ist .
Die Einstellung array_search()auf den strengen Modus löst das Problem nicht, da dann array_search("0", array_keys($a))false zurückgegeben wird, selbst wenn ein Element mit dem Index 0 vorhanden ist.
Meine Lösung konvertiert also einfach alle Indizes von array_keys()in Zeichenfolgen und vergleicht sie dann korrekt:

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

Druckt 1, was richtig ist.

BEARBEITEN:
Wie Shaun im Kommentar unten ausgeführt hat, gilt das Gleiche für den Indexwert, wenn Sie zufällig nach einem int-Index wie diesem suchen:

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

Sie werden immer bekommen 0, was falsch ist, also wäre die Lösung, den Index (wenn Sie eine Variable verwenden) in eine Zeichenfolge wie diese umzuwandeln:

$ind = 0;
echo array_search((string)$ind, array_map("strval", array_keys($a)));
Xriuk
quelle
1
Wenn Sie eine Variable übergeben, sollten Sie sie auch als Zeichenfolge umwandeln, da die Übergabe von Null an ein assoziatives Array den gleichen negativen Effekt hätte. Zum Beispiel: var_dump(array_search(0, array_map("strval", array_keys($a))));wird immer ausgegeben int (0)und nicht bool (false).
Shaun Cockerill
@ShaunCockerill richtig! Meine Antwort wurde aktualisiert, danke für den Hinweis!
Xriuk
0

Eine Lösung, die ich mir ausgedacht habe ... wahrscheinlich ziemlich ineffizient im Vergleich zu Foscos Lösung:

 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++;
   }
  }
 }
n00b
quelle
2
Ja, PHP hat aus einem bestimmten Grund Tausende von integrierten Funktionen. Diese sind normalerweise viel schneller als äquivalente Logik, die auf lange Sicht in PHP-Code geschrieben wurde.
Bill Karwin
3
Dies ist wahrscheinlich schneller als array_search, was zuerst eine Sortierung durchführt und so schmerzhaft langsam ist.
Alasdair
Ah, aber der eingebaute Code ist vorkompiliert, und die Suche wird höchstwahrscheinlich eine binäre Suche sein (vorausgesetzt, sie sortiert zuerst Elemente).
SEoF
0

Alle auf array_keys basierenden Lösungen funktionieren nicht für gemischte Arrays. Die Lösung ist einfach:

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

Von php.net: Wenn der dritte Parameter strict auf TRUE gesetzt ist, sucht die Funktion array_search () nach identischen Elementen im Heuhaufen. Dies bedeutet, dass auch ein strikter Typvergleich der Nadel im Heuhaufen durchgeführt wird und die Objekte dieselbe Instanz sein müssen.

MrBlc
quelle