Zeichen in PHP-Array-Schlüsseln erlaubt?


85

Ich habe einige PHP-Array-Schlüssel, die mit vielen seltsamen Zeichen gefüllt sind.

Ist das erlaubt? Gibt es irgendwelche Einschränkungen für das, was ich nicht verwenden kann?


Einschränkungen:$a = (object) ['@km³' => 123]; error_log($a->@km³);
Bitterblue

Antworten:


89

Nach dem Handbuch :

Der Schlüssel kann entweder eine Ganzzahl oder eine Zeichenfolge sein. Der Wert kann von einem beliebigen Typ sein.

Zusätzlich werden die folgenden Key Casts auftreten:

  • 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.
  • Floats werden auch in Ganzzahlen umgewandelt, was bedeutet, dass der Bruchteil abgeschnitten wird. ZB wird der Schlüssel 8.7 tatsächlich unter 8 gespeichert.
  • Bools werden auch in ganze Zahlen umgewandelt, dh der Schlüssel true wird tatsächlich unter 1 und der Schlüssel false unter 0 gespeichert.
  • Null wird in die leere Zeichenfolge umgewandelt, dh der Schlüssel null wird tatsächlich unter "" gespeichert.
  • Arrays und Objekte können nicht als Schlüssel verwendet werden. Dies führt zu einer Warnung: Unzulässiger Versatztyp.

Das Handbuch noch einmal :

Eine Zeichenfolge besteht aus einer Reihe von Zeichen, wobei ein Zeichen mit einem Byte identisch ist. Dies bedeutet, dass PHP nur einen 256-Zeichen-Satz unterstützt und daher keine native Unicode-Unterstützung bietet. Siehe Details zum Zeichenfolgentyp.

Kurz gesagt, jede Zeichenfolge kann ein Schlüssel sein. Ein String kann beliebige Binärdaten enthalten (bis zu 2 GB). Daher kann ein Schlüssel beliebige Binärdaten sein (da eine Zeichenfolge beliebige Binärdaten sein kann).

Ein zufälliger (gültiger) Missbrauch von Array-Schlüsseln:

$w = array(chr(0) => 'null byte?', chr(rand(0, 255)) => 'random byte?');
var_dump($w);

1
Zur Verdeutlichung bedeutet dies nicht, dass Sie keine Unicode-Zeichenfolgen als Array-Schlüssel verwenden können. Tatsächlich funktioniert jede binäre Zeichenfolge einwandfrei. Ich finde den von PHP selbst beschriebenen Mangel an Unicode-Unterstützung ärgerlich, da er nicht wirklich wahr ist. :)
täuschen

1
@deceze Unicode fällt unter die Kategorie "beliebige Binärdaten" :) (obwohl ich mit dem Wortlaut des Handbuchs denke, denke ich, dass eine Klarstellung notwendig ist). Und zu sagen "bietet keine native Unicode-Unterstützung" ist wahr genug. Es gibt einen PHP-Kern, der keine Unicode-Versionen von strlen, substr usw. enthält. Obwohl "keine native Verarbeitung von Unicode-Strings anbietet" möglicherweise besser geeignet ist.
Corbin

3
Sicher, der Kern enthält keine Funktionen zum Bearbeiten von Unicode-Zeichenfolgen. Aber solange Sie keine Strings manipulieren möchten, unterstützt PHP sie einwandfrei. Realistisch gesehen ist die MB-Erweiterung standardmäßig in praktisch jeder PHP-Installation verfügbar, sodass die Unterscheidung zwischen "Kernunterstützung" oder nicht hauptsächlich akademisch ist. :)
täuschen

1
@deceze vielleicht sollte ihre Notiz "nicht nativ (siehe mb Erweiterung)" oder so etwas dann lesen. Du hast aber recht. Jede PHP-Installation seit 2005 unterstützt im Wesentlichen Unicode, obwohl ich argumentieren würde, dass die Unterstützung von Unicode in PHP (mit Erweiterungen) immer noch etwas unangenehm ist.
Corbin

@Corbin, warum nennst du das Missbrauch statt Gebrauch ?
Pacerier

12

Der Schlüssel muss eine Zeichenfolge oder eine Ganzzahl sein. Es gibt einige Casts, die stattfinden, aber ich denke, das Handbuch macht eine gute Erklärung:

Der Schlüssel kann entweder eine Ganzzahl oder eine Zeichenfolge sein. Der Wert kann von einem beliebigen Typ sein.

Zusätzlich werden die folgenden Key Casts auftreten:

  • 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.
  • Floats werden auch in Ganzzahlen umgewandelt, was bedeutet, dass der Bruchteil abgeschnitten wird. ZB wird der Schlüssel 8.7 tatsächlich unter 8 gespeichert.
  • Bools werden auch in ganze Zahlen umgewandelt, dh der Schlüssel true wird tatsächlich unter 1 und der Schlüssel false unter 0 gespeichert.
  • Null wird in die leere Zeichenfolge umgewandelt, dh der Schlüssel null wird tatsächlich unter "" gespeichert.
  • Arrays und Objekte können nicht als Schlüssel verwendet werden. Dies führt zu einer Warnung: Unzulässiger Versatztyp.

Ressourcentypen können jetzt in Ganzzahlen umgewandelt werden (nicht sicher, ob dies eine neue Funktion ist). Sie können also z. B. indirekt ein Dateihandle oder Curl-Handle als Schlüssel verwenden, indem Sie es in Ganzzahlen umwandeln und als Schlüssel verwenden.
Thomasrutter

10

Ich fand diese Antwort und suchte nach weiteren Informationen zu einem Problem, das ich hatte. Ich habe Zeichenfolgen mit UTF-8-Zeichen verwendet, die nicht als Schlüssel für ein Array dienen würden, das ich hatte.

Etwas wie

$str = "R&D - Solution";
$arr = array( "R&D - Solution" => "Research" );
echo $arr[$str];  // did not work

Die (nicht große oder kluge) Lösung für mich war dies zu tun ..

$str = md5("R&D - Solution");
$arr = array( md5("R&D - Solution") => "Research" );
echo $arr[$str];  // works!

2
Ich mag md5 () zum Generieren von Array-Schlüsseln. Auch wenn es zu diesem Zeitpunkt nicht unbedingt notwendig ist, fühlt es sich dennoch sicherer an.
Billynoah

1
md5 () ist perfekt zum Generieren eines Klartextschlüssels aus einer beliebigen Zeichenfolge. Sicherheit ist nicht das Problem. Es ist auch gut, dass es schnell ist. Die einzige Frage ist, ob sie sich entscheiden, es zu verwerfen und dann zu beseitigen, weil es jetzt nicht mehr gut für das ist, was es ursprünglich entworfen wurde. Wir werden sehen.
Patanjali

2
Haben Sie eine ältere Version von PHP verwendet? Ihr erstes Beispiel funktioniert gut in PHP 7.1.
Elliot B.

6

PHP-Array-Schlüssel können Ganzzahlen oder Zeichenfolgen sein. PHP-Strings sind Byte-Arrays, dh Folgen von Bytes. Es gibt keine anderen Arten von Zeichenfolgen, und PHP legt ansonsten keine besonderen Einschränkungen für Array-Schlüsselzeichenfolgen fest. Mit anderen Worten: Solange es sich um eine Zeichenfolge handelt, ist alles möglich.


Ich denke, die implizite Umwandlung von einem String in einen Ganzzahlschlüssel ist eine wichtige Unterscheidung, da bestimmte Funktionen unterschiedlich funktionieren, ob der Schlüssel eine Ganzzahl ist oder nicht. Sie können beispielsweise nur beliebige Zeichenfolgen verwenden, um festzustellen, dass eine Array-Funktion sie später von 0..n-1 neu indiziert.
Matthew

1
Einverstanden, aber ich würde denken, es liegt an der Grenze des Umfangs dieser Frage. :)
täuschen

5

Alles, was Sie in eine PHP-Zeichenfolge einfügen können, kann als Array-Schlüssel verwendet werden. Die Anzahl der Zeichen ist unbegrenzt.

$a = array();

$x = 'long string of random garage';
echo $a[$x]; // this is ok

$x = array();
echo $a[$x]; // not ok

0

Ich persönlich hatte keine Probleme mit ungewöhnlichen Zeichen in Array-Schlüsseln. Was legal ist und was nicht, ist nicht gut dokumentiert, außer zu sagen, dass der Schlüssel ein Skalar sein muss. Ihre beste Wette ist es, es einfach zu versuchen und zu sehen.


Ein bisschen inkonsistent, ja, aber es ist gut dokumentiert.
Corbin

0

Zusätzlich zu allen Antworten, wie sie wahr sind: Sie können PSRs verwenden , die eine Art Regel zwischen den besten Programmierern darstellen, um einen netten und standardmäßigen Codierungsstil zu haben.


0

Wenn komplexe Schlüssel einen "undefinierten Index" -Fehler verursachen, liegt möglicherweise einfach ein "Trimm" -Problem vor.

Ich war verrückt, weil ein komplexer Schlüssel den Fehler "undefinierter Index" ausspuckte und ich dachte, es sei vielleicht eine Syntaxverletzung. Der Array-Schlüssel, der den Fehler verursacht, wurde aus einem Feld aus einer MySQL-Datenbankabfrage erstellt, die ich in einen Schlüssel konvertierte und in einem neuen Array verwendete. Der Schlüssel sah so aus: pl_1DNKoiJKwotCqAycickBVhTyund so wurde der Code aufgebaut.

//new array created from database query
$new_array[$dbquery['fieldname']] = {some value};

//key value found in field of second array
$keyval = $array_two['fieldname'];

//this produced the "undefined index" error
echo $new_array[$keyval];

wenn in der Tat die $keyval$dbquery['fieldname'] schien und eine perfekte Übereinstimmung zu sein (visuell überprüft, indem beide an den Browser zurückgegeben wurden). Das Rätsel wurde durch einfaches Verwenden gelösttrim in der zweiten Aussage$keyval = trim($array_two['fieldname']); Folgendes verwendet wurde : Einmal "getrimmt", beschwerte sich PHP nicht mehr.

In der Hoffnung, dass dies einige andere vor frustrierenden Momenten bewahrt ...


-1

Codieren Sie die PHP-Seite in ANSI "é" kann verwendet werden (Cinéma wird nicht als Cinéma angezeigt). Verwenden Sie in Notepad ++ einfach das Menü Encode => ANSI konvertieren und speichern


2
(Dieser Beitrag scheint keine qualitativ hochwertige Antwort auf die Frage zu bieten . Bitte bearbeiten Sie entweder Ihre Antwort oder veröffentlichen Sie sie einfach als Kommentar zur Frage.)
sɐunıɔ ןɐ qɐp

Können Sie das weiter erklären? Was ist, wenn ées nicht vorhanden ist? Was ist, wenn das OP Notepad ++ doch nicht verwendet?
Nico Haase
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.