PHPで(空の)配列を初期化する最良の方法


297

他の特定の言語(AS3など)では、新しい配列の初期化は、オブジェクトの作成とインスタンス化の理由var foo = []よりもvar foo = new Array()、このように行う方が高速であることが指摘されています。PHPに同等の機能があるかしら。

class Foo {
    private $arr = array(); // is there another / better way?
}

11
私がやることはそれだけです。
マシュー

2
答えてくれた皆さんに感謝します(そしてすぐに!)。アンディが最も詳細に思われるので、私は任意に回答を選択する必要がありました。
トムオージェ、

1
この質問は大いに役立ちます
Hitesh

array_fillやってみる?php.net/manual/en/function.array-fill.php
zx1986

2
@ zx1986これは、空の配列を作成するかなり面倒な方法です。確かにOP未満$arr = array()$arr = []
トム・オージェ

回答:


189

ECMAScript実装(たとえば、ActionScriptまたはJavaScript)では、Array()はコンストラクター関数であり[]、配列リテラル文法の一部です。どちらも完全に異なる方法で最適化され、実行されます。リテラル文法は、関数を呼び出すオーバーヘッドによって処理されません。

一方、PHPには、関数のように見えてもそのように扱われない言語構造があります。[]代替としてサポートするPHP 5.4を使用しても、コンパイラー/パーサーに関する限り、それらは完全に同義であるため、オーバーヘッドに違いはありません。

// 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",
];

古いバージョンのPHPをサポートする必要がある場合は、前の構文を使用してください。読みやすさについても議論がありますが、これは長年のJS開発者である私にとって、後者はかなり自然なことのようです。私が実際[]に最初にPHPを学習していたときに、配列を初期化しようとするのは間違いでした。

言語へのこの変更は、以下の理由でコア開発者による過半数の反対により当初は提案され拒否されていました:

コア開発者のわずかな過半数が反対したため、このパッチは受け入れられません。コア開発者とユーザーランドの投票の間の累積された平均をとると、反対が表示されるように見えますが、長期的にはサポートされていない、または維持されていないパッチ魔女の提出は無責任です。

ただし、おそらく5.4に至るまでの心の変化があったようです。おそらく、MongoDB(ECMAScript構文を使用)などの一般的なデータベースのサポートの実装に影響されています。


51
おそらく5.4の変更が行われたのは、 "which"をスペルできる人が投票プロセスを引き継いだためです:)
Rob Grant

40
$array = [];JSとPHPの間を行き来するのが簡単になるので、私は好みます。
ジャスティン

だから$array = []; より良いオプションですか??? または私は他のものを試してみる必要があります。どちらが良いですか
Hitesh 2014年

2
@hitesh:それは個人的な好みの問題です。どちらも機能的に[]はまったく同じで、タイプするのが少し簡単です。
アンディE

7
[]構文は一般的に好まれるようですが、5.3を排他的に使用している多数のホストがあることに注意することが重要です。コードを配布したい場合、[]構文は致命的になります。
その他

204
$myArray = []; 

空の配列を作成します。

次のように、後で配列に値をプッシュできます。

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

この時点で、$ myArrayには「tree」、「house」、および「dog」が含まれています。上記の各コマンドは配列に追加され、すでにそこにあった項目を保持します。

他の言語から来たので、配列に追加するこの方法は私には奇妙に思えました。$ myArray + = "dog"か何か、またはVisual Basicコレクションのような "add()"メソッドを実行する必要があると思っていました。しかし、この直接追加構文は確かに短くて便利です。

アイテムを削除するには、実際にはunset()関数を使用する必要があります。

unset($myArray[1]); 

...配列から「家」を削除します(配列はゼロベースです)。

unset($myArray); 

...アレイ全体を破壊します。

明確に言うと、配列に追加する空の角括弧構文は、YOUがインデックスを割り当てるのではなく、PHPに各値にインデックスを自動的に割り当てるように指示する方法です。陰で、PHPは実際にこれを行っています:

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

必要に応じてインデックスを自分で割り当てることができ、必要な数を使用できます。一部のアイテムにはインデックス番号を割り当て、他のアイテムには割り当てないこともできます。これを行うと、PHPは不足しているインデックス番号を埋め、割り当てられた最大のインデックス番号から順にインクリメントします。

したがって、これを行う場合:

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

...項目「犬」には21のインデックス番号が与えられます。PHPは、インクリメンタルインデックス割り当てのためのインテリジェントなパターンマッチングを実行しないため、30のインデックスを「犬」に割り当てたかったかどうかはわかりません。 」他の関数を使用して、配列の増分パターンを指定できます。ここでは詳しく説明しませんが、すべてPHPのドキュメントに記載されています。

乾杯、

-=キャメロン


6
$ ary = []はPHP 5.4以降でのみ機能することに注意してください。ただし、パフォーマンスの観点からは、[]とarray()を比較するメリットはありません。
トム・オージェ

1
以前のバージョンでは、array_push()w3schools.com/php/func_array_push.asp を使用できます。これに関連するパフォーマンスヒットがあるかどうかはわかりません。
マーク

3
@TomAugerのポイント@Markを誤解しました。 $array[] = 'foo'古いバージョンのPHPでは問題なく動作します。$array = [];5.4で新しくなった配列を初期化するだけです。
Codemonkey、2015年

公平に言うと、これは実際にはOPの質問に答えます。
Smitty

笑...吹き飛ばされた心。数十年のPHPと私は、あなたがarray_pushを必要としないことを学んでいるだけです。
バンコクの


26

PHPでは、配列は配列です。プリミティブ対オブジェクトの考慮事項がないため、同等の最適化を行う必要はありません。


1
最良の回答IMO:構文は異なりますが、パフォーマンスに関してはすべて同じです。
Matthieu Napoli

1
両方に関連するパフォーマンスの問題はありますか?。これについてどこで確認できますか?リンクまたはドキュメント
Hitesh

2
その結果、あなたのコードは、前の5.4の環境上で実行されることはありません、使用$配列=新しい配列()あなたがしていることを確認するまで
トム・オージェ

20

あなたがやっていることは100%正しいです。

優れた名前付けに関しては、プライベート/保護されたプロパティの前にアンダースコアを付けて、それらがパブリックでないことを明確にすることがよく行われます。たとえばprivate $_arr = array()public $arr = array()


2
PHPでは、常に$this値を取得するために使用し、パブリックプロパティを使用してはならないため、アンダースコアを付けない方がよいと思います。
メゼ

1
あなたのようにアクセスしたい@meze $this->arr$this->_arr。なぜパブリックプロパティを使用すべきではないのですか?
ジェームズC

5

これを試して:

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

    // will print
    // array(0) { }

4
かっこいいですが、本当に便利なコーディングパターンよりもパーティートリックとして、あなたは思いませんか?
トムオージェ

プロパティパターンを持つオブジェクトで配列を作成し、最後に配列に変換する場合に便利です。
Jomar Sevillejo、2015

4

他に方法ないのでこれが一番です。

編集:この回答は、PHP 5.4以降では無効です。


これはもう当てはまりません。5.4では、配列の省略構文が導入されました。
アンディE

13
@Motesなぜそんなに嫌いは:「?(冗談はさておき、私は昔の答えを『打つ』ことにより、それをより明示的に作った初心者は、答えが変更されていることを理解することは依然として有用である可能性。。
マシューナポリ

@Motes人々が回答を削除すると、回答から得られた担当者の利益が失われます。編集することをお勧めします。
mbomb007

4

単純な配列の初期化:

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

配列内の配列を初期化しています:

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

ソース:コードのソース


3
元の質問は、空の配列を初期化する方法に関するものでした。
Tom Auger 14
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.