Der beste Weg, um ein (leeres) Array in PHP zu initialisieren

297

In bestimmten anderen Sprachen (z. B. AS3) wurde festgestellt, dass die Initialisierung eines neuen Arrays schneller ist, wenn dies so erfolgt, var foo = []als var foo = new Array()aus Gründen der Objekterstellung und -instanziierung. Ich frage mich, ob es in PHP Äquivalenzen gibt.

class Foo {
    private $arr = array(); // is there another / better way?
}
Tom Auger
quelle
11
Das ist alles was ich jemals mache.
Matthew
2
Vielen Dank an alle, die geantwortet haben (und so schnell!). Ich musste willkürlich eine Antwort auswählen, damit Andys die ausführlichste zu sein schien.
Tom Auger
1
Diese Frage hilft sehr
Hitesh
versuchen array_fill? php.net/manual/en/function.array-fill.php
zx1986
2
@ zx1986 das ist eine ziemlich umständliche Art, ein leeres Array zu erstellen. Sicher weniger als das OP $arr = array()oder$arr = []
Tom Auger

Antworten:

189

In ECMAScript-Implementierungen (z. B. ActionScript oder JavaScript) Array()ist dies eine Konstruktorfunktion und []Teil der Array-Literal-Grammatik. Beide werden auf völlig unterschiedliche Weise optimiert und ausgeführt, wobei die wörtliche Grammatik nicht durch den Aufwand beim Aufrufen einer Funktion beeinträchtigt wird.

PHP hingegen verfügt über Sprachkonstrukte, die wie Funktionen aussehen, aber nicht als solche behandelt werden. Selbst mit PHP 5.4, das []als Alternative unterstützt wird, gibt es keinen Unterschied im Overhead, da sie für den Compiler / Parser völlig synonym sind.

// Before 5.4, you could only write
$array = array(
    "foo" => "bar",
    "bar" => "foo",
);

// As of PHP 5.4, the following is synonymous with the above
$array = [
    "foo" => "bar",
    "bar" => "foo",
];

Wenn Sie ältere Versionen von PHP unterstützen müssen, verwenden Sie die frühere Syntax. Es gibt auch ein Argument für Lesbarkeit, aber als langjähriger JS-Entwickler erscheint mir letzteres ziemlich natürlich. Ich habe tatsächlich den Fehler gemacht, Arrays mit zu initialisieren, []als ich PHP zum ersten Mal lernte.

Diese Änderung der Sprache wurde ursprünglich vorgeschlagen und aufgrund einer Mehrheitsentscheidung der Kernentwickler aus folgendem Grund abgelehnt:

Dieser Patch wird nicht akzeptiert, da die geringe Mehrheit der Kernentwickler dagegen gestimmt hat. Wenn Sie jedoch einen kumulierten Mittelwert zwischen Kernentwicklern und Userland-Abstimmungen nehmen, der das Gegenteil zu zeigen scheint, wäre es unverantwortlich, einen Patch einzureichen, der auf lange Sicht nicht unterstützt oder gewartet wird.

Es scheint jedoch, dass sich das Herz bis 5.4 geändert hat, was möglicherweise durch die Implementierung der Unterstützung für gängige Datenbanken wie MongoDB (die ECMAScript-Syntax verwenden) beeinflusst wurde.

Andy E.
quelle
51
Möglicherweise wurde die Änderung 5.4 vorgenommen, weil Leute, die buchstabieren konnten, "welche" den Abstimmungsprozess übernahmen :)
Rob Grant
40
Ich bevorzuge es, $array = [];da es das Hin- und Herwechseln zwischen JS und PHP erleichtert.
Justin
Also ist $array = []; bessere Option? oder sollte ich es mit einem anderen versuchen. welches ist besser
Hitesh
2
@hitesh: Es ist eine Frage der persönlichen Präferenz. Sie sind beide funktional genau gleich, []sind nur ein wenig einfacher zu tippen.
Andy E
7
Die [] -Syntax scheint allgemein bevorzugt zu sein, aber es ist wichtig zu beachten, dass es eine große Anzahl von Hosts gibt, die immer noch ausschließlich 5.3 verwenden. Wenn Sie Ihren Code verteilen möchten, ist die Syntax [] fatal.
usw.
204
$myArray = []; 

Erstellt ein leeres Array.

Sie können Werte später wie folgt auf das Array übertragen:

$myArray[] = "tree";
$myArray[] = "house";
$myArray[] = "dog";

Zu diesem Zeitpunkt enthält $ myArray "Baum", "Haus" und "Hund". Jeder der oben genannten Befehle wird an das Array angehängt, wobei die bereits vorhandenen Elemente beibehalten werden.

Da ich aus anderen Sprachen stamme, kam mir diese Art des Anhängens an ein Array seltsam vor. Ich hatte erwartet, etwas wie $ myArray + = "dog" oder so etwas tun zu müssen ... oder vielleicht eine "add ()" - Methode wie Visual Basic-Sammlungen. Aber diese Syntax zum direkten Anhängen ist sicherlich kurz und bequem.

Sie müssen tatsächlich die Funktion unset () verwenden, um Elemente zu entfernen:

unset($myArray[1]); 

... würde "house" aus dem Array entfernen (Arrays sind nullbasiert).

unset($myArray); 

... würde das gesamte Array zerstören.

Um es klar auszudrücken, ist die Syntax der leeren eckigen Klammern zum Anhängen an ein Array lediglich eine Möglichkeit, PHP anzuweisen, die Indizes jedem Wert automatisch zuzuweisen, anstatt dass SIE die Indizes zuweisen. Unter dem Deckmantel macht PHP tatsächlich Folgendes:

$myArray[0] = "tree";
$myArray[1] = "house";
$myArray[2] = "dog";

Sie können selbst Indizes zuweisen, wenn Sie möchten, und Sie können beliebige Zahlen verwenden. Sie können einigen Elementen auch Indexnummern zuweisen und anderen nicht. Wenn Sie dies tun, füllt PHP die fehlenden Indexnummern aus und erhöht sie von der größten zugewiesenen Indexnummer.

Wenn Sie dies tun:

$myArray[10] = "tree";
$myArray[20] = "house";
$myArray[] = "dog";

... dem Element "Hund" wird eine Indexnummer von 21 zugewiesen. PHP führt keinen intelligenten Mustervergleich für die inkrementelle Indexzuweisung durch, sodass es nicht weiß, dass Sie möglicherweise gewünscht haben, dass es "Hund" einen Index von 30 zuweist ". Sie können andere Funktionen verwenden, um das Inkrementmuster für ein Array anzugeben. Ich werde hier nicht darauf eingehen, aber es ist alles in den PHP-Dokumenten.

Prost,

- = Cameron

C Landreaux
quelle
6
Es ist wichtig zu beachten, dass $ ary = [] nur nach PHP 5.4 funktioniert. Aus Sicht der Leistung bietet [] jedoch keinen Vorteil gegenüber array ().
Tom Auger
1
Für frühere Versionen können Sie array_push () verwenden. W3schools.com/php/func_array_push.asp Ich weiß nicht, ob damit ein Leistungseinbruch verbunden ist.
Mark
3
Sie haben @ TomAugers Punkt @Mark falsch verstanden. $array[] = 'foo'funktioniert gut in älteren Versionen von PHP. Es wird nur $array = [];ein Array initialisiert, das in 5.4 neu ist.
Codemonkey
Um fair zu sein, beantwortet dies tatsächlich die Frage des OP.
Smitty
lol ... Verblüfft. Jahrzehntelange PHP und ich lerne nur, dass Sie array_push nicht brauchen.
Bangkokian
61

Vor PHP 5.4:

$myArray = array();

PHP 5.4 und höher

$myArray = [];
Md. Shafiqur Rahman
quelle
Und wie können wir mit PHP 5.4 oder höher mehrdimensionale Arrays erstellen?
Siraj Alam
26

In PHP ist ein Array ein Array. Es gibt keine primitive oder objektbezogene Betrachtung, daher ist keine vergleichbare Optimierung möglich.

Adrian
quelle
1
Die beste Antwort IMO: Es gibt verschiedene Syntaxen, aber in Bezug auf die Leistung sind alle gleich.
Matthieu Napoli
1
Gibt es ein Leistungsproblem für beide? Wo kann ich das überprüfen? Jeder Link oder Dokument
Hitesh
2
Verwenden Sie daher $ array = new array ()
Tom Auger,
20

Was Sie tun, ist 100% richtig.

In Bezug auf nette Namen wird häufig darauf hingewiesen, dass privaten / geschützten Eigenschaften ein Unterstrich vorangestellt wird, um zu verdeutlichen, dass sie nicht öffentlich sind. ZB private $_arr = array()oderpublic $arr = array()

James C.
quelle
2
In PHP denke ich, dass es besser ist, sie nicht mit einem Unterstrich zu benennen, da Sie immer verwenden $this, um den Wert zu erhalten, und niemals öffentliche Eigenschaften verwenden sollten.
Meze
1
@meze du würdest gerne auf sie zugreifen $this->arrund $this->_arr. Warum sollten Sie niemals öffentliche Immobilien nutzen?!
James C
5

Versuche dies:

    $arr = (array) null;
    var_dump($arr);

    // will print
    // array(0) { }
Pyetro
quelle
4
Ein bisschen cool, aber eher als Partytrick als als wirklich nützliches Codierungsmuster, findest du nicht?
Tom Auger
Dies kann nützlich sein, wenn Sie Ihr Array in einem Objekt mit Eigenschaftenmuster erstellen und am Ende in ein Array konvertieren möchten.
Jomar Sevillejo
4

Es gibt keinen anderen Weg , also ist dies der beste.

Bearbeiten: Diese Antwort ist seit PHP 5.4 und höher nicht gültig.

Matthieu Napoli
quelle
Dies ist nicht mehr der Fall. 5.4 führte die Kurzschrift-Syntax für Arrays ein.
Andy E
13
@Motes Warum so viel Hass: '(? Scherz beiseite, ich habe es deutlicher gemacht, indem ich die alte Antwort "gestrichen" habe. Es könnte für einen Neuling immer noch nützlich sein zu verstehen, dass sich die Antwort geändert hat.
Matthieu Napoli
@Motes Leute verlieren den Wiederholungsgewinn aus der Antwort, wenn sie sie löschen. Es ist besser, es zu bearbeiten.
mbomb007
4

Initialisieren eines einfachen Arrays:

<?php $array1=array(10,20,30,40,50); ?>

Array innerhalb des Arrays initialisieren:

<?php  $array2=array(6,"santosh","rahul",array("x","y","z")); ?>

Quelle: Sorce für den Code

Improgrammer
quelle
3
Die ursprüngliche Frage war, wie ein leeres Array initialisiert werden kann .
Tom Auger