Wie vom OP angegeben :
PHP behandelt alle Arrays als assoziativ
Es ist nicht ganz sinnvoll (IMHO), eine Funktion zu schreiben, die prüft, ob ein Array assoziativ ist . Also als erstes: Was ist ein Schlüssel in einem PHP-Array ?
Der Schlüssel kann entweder eine Ganzzahl oder eine Zeichenfolge sein .
Das heißt, es gibt 3 mögliche Fälle:
- Fall 1. Alle Schlüssel sind numerisch / ganzzahlig .
- Fall 2. Alle Schlüssel sind Zeichenfolgen .
- Fall 3. Einige Schlüssel sind Zeichenfolgen , einige Schlüssel sind numerische / ganze Zahlen .
Wir können jeden Fall mit den folgenden Funktionen überprüfen.
Fall 1: Alle Schlüssel sind numerisch / ganzzahlig .
Hinweis : Diese Funktion gibt auch für leere Arrays true zurück .
//! Check whether the input is an array whose keys are all integers.
/*!
\param[in] $InputArray (array) Input array.
\return (bool) \b true iff the input is an array whose keys are all integers.
*/
function IsArrayAllKeyInt($InputArray)
{
if(!is_array($InputArray))
{
return false;
}
if(count($InputArray) <= 0)
{
return true;
}
return array_unique(array_map("is_int", array_keys($InputArray))) === array(true);
}
Fall 2: Alle Schlüssel sind Zeichenfolgen .
Hinweis : Diese Funktion gibt auch für leere Arrays true zurück .
//! Check whether the input is an array whose keys are all strings.
/*!
\param[in] $InputArray (array) Input array.
\return (bool) \b true iff the input is an array whose keys are all strings.
*/
function IsArrayAllKeyString($InputArray)
{
if(!is_array($InputArray))
{
return false;
}
if(count($InputArray) <= 0)
{
return true;
}
return array_unique(array_map("is_string", array_keys($InputArray))) === array(true);
}
Fall 3. Einige Schlüssel sind Zeichenfolgen , einige Schlüssel sind numerische / ganze Zahlen .
Hinweis : Diese Funktion gibt auch für leere Arrays true zurück .
//! Check whether the input is an array with at least one key being an integer and at least one key being a string.
/*!
\param[in] $InputArray (array) Input array.
\return (bool) \b true iff the input is an array with at least one key being an integer and at least one key being a string.
*/
function IsArraySomeKeyIntAndSomeKeyString($InputArray)
{
if(!is_array($InputArray))
{
return false;
}
if(count($InputArray) <= 0)
{
return true;
}
return count(array_unique(array_map("is_string", array_keys($InputArray)))) >= 2;
}
Es folgt dem:
Nun, damit ein Array ein "echtes" Array ist , an das wir alle gewöhnt sind, was bedeutet:
- Die Schlüssel sind alle numerisch / ganzzahlig .
- Die Tasten sind sequentiell (dh um Schritt 1 erhöht).
- Die Tasten beginnen bei Null .
Wir können mit der folgenden Funktion überprüfen.
Fall 3a. Schlüssel sind numerisch / ganzzahlig , sequentiell und nullbasiert .
Hinweis : Diese Funktion gibt auch für leere Arrays true zurück .
//! Check whether the input is an array whose keys are numeric, sequential, and zero-based.
/*!
\param[in] $InputArray (array) Input array.
\return (bool) \b true iff the input is an array whose keys are numeric, sequential, and zero-based.
*/
function IsArrayKeyNumericSequentialZeroBased($InputArray)
{
if(!is_array($InputArray))
{
return false;
}
if(count($InputArray) <= 0)
{
return true;
}
return array_keys($InputArray) === range(0, count($InputArray) - 1);
}
Vorsichtsmaßnahmen / Fallstricke (oder noch eigentümlichere Fakten zu Array-Schlüsseln in PHP)
Ganzzahlige Schlüssel
Die Schlüssel für diese Arrays sind Ganzzahlen :
array(0 => "b");
array(13 => "b");
array(-13 => "b"); // Negative integers are also integers.
array(0x1A => "b"); // Hexadecimal notation.
String-Schlüssel
Die Schlüssel für diese Arrays sind Zeichenfolgen :
array("fish and chips" => "b");
array("" => "b"); // An empty string is also a string.
array("stackoverflow_email@example.com" => "b"); // Strings may contain non-alphanumeric characters.
array("stack\t\"over\"\r\nflow's cool" => "b"); // Strings may contain special characters.
array('$tα€k↔øv∈rflöw⛄' => "b"); // Strings may contain all kinds of symbols.
array("functіon" => "b"); // You think this looks fine? Think again! (see https://stackoverflow.com/q/9246051/1402846)
array("ま말轉转ДŁ" => "b"); // How about Japanese/Korean/Chinese/Russian/Polish?
array("fi\x0sh" => "b"); // Strings may contain null characters.
array(file_get_contents("https://www.google.com/images/nav_logo114.png") => "b"); // Strings may even be binary!
Ganzzahlige Schlüssel, die wie Zeichenfolgen aussehen
Wenn Sie glauben, dass der Schlüssel array("13" => "b")
eine Zeichenfolge ist , liegen Sie falsch . Aus dem Dokument hier :
Zeichenfolgen, die gültige Ganzzahlen enthalten, werden in den Ganzzahltyp umgewandelt. ZB wird der Schlüssel "8" tatsächlich unter 8 gespeichert. Andererseits wird "08" nicht umgewandelt, da es sich nicht um eine gültige Dezimalzahl handelt.
Der Schlüssel für diese Arrays sind beispielsweise Ganzzahlen :
array("13" => "b");
array("-13" => "b"); // Negative, ok.
Der Schlüssel für diese Arrays sind jedoch Zeichenfolgen :
array("13." => "b");
array("+13" => "b"); // Positive, not ok.
array("-013" => "b");
array("0x1A" => "b"); // Not converted to integers even though it's a valid hexadecimal number.
array("013" => "b"); // Not converted to integers even though it's a valid octal number.
array("18446744073709551616" => "b"); // Not converted to integers as it can't fit into a 64-bit integer.
Was mehr ist, laut dem Dokument ,
Die Größe einer Ganzzahl ist plattformabhängig, obwohl ein Maximalwert von etwa zwei Milliarden der übliche Wert ist (das sind 32 Bit Vorzeichen). 64-Bit-Plattformen haben normalerweise einen Maximalwert von etwa 9E18, mit Ausnahme von Windows, das immer 32-Bit ist. PHP unterstützt keine vorzeichenlosen Ganzzahlen.
Der Schlüssel für dieses Array kann also eine Ganzzahl sein oder auch nicht - dies hängt von Ihrer Plattform ab.
array("60000000000" => "b"); // Array key could be integer or string, it can fit into a 64-bit (but not 32-bit) integer.
Noch schlimmer ist , neigt dazu , PHP zu sein Buggy , wenn die ganzen Zahl in der Nähe der 2 31 = 2147483648 Grenze (siehe Bug 51430 , bug 52899 ). Zum Beispiel in meiner lokalen Umgebung (PHP 5.3.8 unter XAMPP 1.7.7 unter Windows 7) var_dump(array("2147483647" => "b"))
gibt
array(1) {
[2147483647]=>
string(1) "b"
}
In dieser Live-Demo auf dem Codepad (PHP 5.2.5) gibt es jedoch den gleichen Ausdruck
array(1) {
["2147483647"]=>
string(1) "b"
}
Der Schlüssel ist also eine Ganzzahl in einer Umgebung, aber eine Zeichenfolge in einer anderen, obwohl 2147483647
es sich um eine gültige vorzeichenbehaftete 32-Bit- Ganzzahl handelt .