Ist es möglich, eine numerische Zeichenfolge wie "123"
einen Schlüssel in einem PHP-Array zu verwenden, ohne sie in eine Ganzzahl umzuwandeln?
$blah = array('123' => 1);
var_dump($blah);
druckt
array(1) {
[123]=>
int(1)
}
Ich will
array(1) {
["123"]=>
int(1)
}
"123"
==123
für fast jeden Zweck. Was ist der Grund, warum Sie es speziell als String wollen (und ein Int zu haben ist schlecht)?array_merge
"Wenn die Eingabearrays dieselben Zeichenfolgenschlüssel haben, überschreibt der spätere Wert für diesen Schlüssel den vorherigen. Wenn die Arrays jedoch numerische Schlüssel enthalten , wird der spätere Wert dies nicht tun." überschreibt den ursprünglichen Wert, wird aber angehängt. "asort
Antworten:
Nein; Nein, ist es nicht:
Aus dem Handbuch :
Nachtrag
Aufgrund der folgenden Kommentare dachte ich, es würde Spaß machen, darauf hinzuweisen, dass das Verhalten ähnlich, aber nicht identisch mit JavaScript-Objektschlüsseln ist.
quelle
Ja, es ist durch Array-Casting eines
stdClass
Objekts möglich:Das gibt Ihnen (bis PHP Version 7.1):
(Update: Meine ursprüngliche Antwort zeigte einen komplizierteren Weg mit
json_decode()
undjson_encode()
der nicht notwendig ist.)Beachten Sie den Kommentar : Es ist leider nicht möglich, den Wert direkt zu referenzieren:
$data['12']
Dies führt zu einem Hinweis.Update :
Ab PHP 7.2 auf es ist auch möglich , eine numerische Zeichenfolge als Schlüssel zu verwenden , um den Wert zu verweisen:
quelle
echo $data['12'];
. Es wird der Fehler "Hinweis: Undefinierter Versatz: 12 Zoll in Zeile 5" angezeigt.array_key_exists
wird es auch in den älteren Versionen nicht gefunden.Wenn Sie einen numerischen Schlüssel in einer PHP-Datenstruktur verwenden müssen, funktioniert ein Objekt. Und Objekte behalten die Ordnung bei, sodass Sie iterieren können.
quelle
array()
, daher gehe ich davon aus, dass in diesem Kontext Zeichenfolgen, die gültige Ganzzahlen angeben , in den Ganzzahltyp umgewandelt werden. Es stellt sich jedoch heraus, dass es andere Möglichkeiten gibt, Arrays zu erstellen, bei denen dies nicht der Fall ist. wie in Davids Antwort, die ich getestet habe.Meine Problemumgehung ist:
Das Leerzeichen char (prepend) ist eine gute Lösung, da die int-Konvertierung beibehalten wird:
Sie sehen 55 als int.
quelle
"0$id" => $value
. Vorarbeiten mit0
Arbeiten auch.Sie können den Schlüssel in eine Zeichenfolge eingeben, er wird jedoch aufgrund der losen Eingabe von PHP möglicherweise in eine Ganzzahl konvertiert. Überzeugen Sie sich selbst:
Aus dem PHP-Handbuch:
quelle
[42 => 'answer', 'snafu' => 'fubar']
Ich hatte dieses Problem beim Versuch, Arrays zusammenzuführen, die sowohl Zeichenfolgen- als auch Ganzzahlschlüssel hatten. Es war wichtig, dass die Ganzzahlen auch als Zeichenfolge behandelt werden, da dies Namen für Eingabefelder waren (wie bei Schuhgrößen usw.).
Wenn ich
$data = array_merge($data, $extra);
PHP benutzte, ordnete ich die Schlüssel neu. Bei einem Bestellversuch wurden die Ganzzahlschlüssel (ich habe es mit6
-'6'
-"6"
auch(string)"6"
als Schlüssel versucht ) von 0 inn
... umbenannt. Wenn Sie darüber nachdenken, wäre dies in den meisten Fällen das gewünschte Verhalten.Sie können dies umgehen, indem Sie
$data = $data + $extra;
stattdessen verwenden. Ziemlich einfach, aber ich habe zuerst nicht daran gedacht ^^.quelle
FALSCH
Ich habe eine Casting-Funktion, die sequentielles bis assoziatives Array-Casting handhabt.
quelle
Um dieses Problem zu umgehen, können Sie das PHP-Array mit der Option JSON_FORCE_OBJECT in ein JSON-Objekt codieren.
dh dieses Beispiel:
wird darin enden, dass:
quelle
Ich bin auf ein Array mit '0' und '' als Schlüssel gestoßen. Dies bedeutete, dass ich meine Array-Schlüssel weder mit == noch mit === überprüfen konnte.
Die Problemumgehung besteht darin, die Array-Schlüssel vor der Verwendung wieder in Zeichenfolgen umzuwandeln.
quelle
Beachten Sie in Bezug auf die @ David-Lösung, dass die Zahlen nicht funktionieren, wenn Sie versuchen, auf die Zeichenfolgenwerte im assoziativen Array zuzugreifen. Ich vermute, dass sie hinter den Kulissen (beim Zugriff auf das Array) in ganze Zahlen umgewandelt werden und kein Wert gefunden wird. Der Zugriff auf die Werte als Ganzzahlen funktioniert ebenfalls nicht. Sie können jedoch array_shift () verwenden, um die Werte abzurufen oder das Array zu iterieren.
quelle
"0"
wird0
mit PHP7.2.10
.Ich hatte dieses Problem beim Versuch, ein Array zu sortieren, bei dem der Sortierschlüssel ein Hex sha1 sein musste. Wenn ein resultierender sha1-Wert keine Buchstaben enthält, wandelt PHP den Schlüssel in eine Ganzzahl um. Aber ich musste das Array nach der relativen Reihenfolge der Zeichenfolgen sortieren. Also musste ich einen Weg finden, den Schlüssel als String zu erzwingen, ohne die Sortierreihenfolge zu ändern.
In der ASCII-Tabelle ( https://en.wikipedia.org/wiki/ASCII ) ist das Ausrufezeichen ungefähr gleich groß wie das Leerzeichen und sicherlich niedriger als alle Zahlen und Buchstaben.
Also habe ich ein Ausrufezeichen am Ende der Schlüsselzeichenfolge angehängt.
quelle