web-dev-qa-db-ja.com

空の配列を初期化するための最良の方法 PHP

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

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

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を学んだとき、私は実際に[]を使って配列を初期化しようとしているのを間違えました。

この言語への change はもともと提案され、次の理由でコア開発者による大多数の投票により却下されました:

コア開発者の大多数が反対したため、このパッチは承認されません。あなたがコア開発者とユーザーランド票との間の累積された平均をとるなら反対は反対であるように思われるけれどもそれはパッチの魔女を提出することは無責任であろう長い目で見てサポートされず

しかし、MongoDB(ECMAScript構文を使用する)のような一般的なデータベースのサポートの実装の影響を受けて、5.4までの心の変化があったようです。

172
Andy E
$myArray = []; 

空の配列を作成します。

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

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

この時点で、$ myArrayには "tree"、 "house"、 "dog"が含まれています。上記の各コマンドは、すでに存在していた項目を保持しながら、配列に追加します。

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

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

unset($myArray[1]); 

...配列から "house"を削除します(配列は0から始まります)。

unset($myArray); 

...アレイ全体を破壊するでしょう。

明確にするために、配列に追加するための空の角括弧構文は、インデックスを割り当てるのではなく、単にPHPにインデックスを各値に自動的に割り当てるように指示する方法です。カバーの下で、PHPは実際にこれをやっています:

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

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

あなたがこれをするならば:

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

...項目 "dog"には21のインデックス番号が与えられます。PHPは、インクリメンタルインデックス割り当てのためのインテリジェントなパターンマッチングを行いません。 「犬」への30のインデックス。他の関数を使用して、配列の増分パターンを指定することができます。ここでは説明しませんが、そのすべてはPHP docsにあります。

乾杯、

- =キャメロン

185
C Landreaux

PHP 5.4より前:

$myArray = array();

PHP 5.4以降

$myArray = [];
52

PHPでは、配列は配列です。プリミティブとオブジェクトの考慮はありませんので、同等の最適化はありません。

26
Adrian

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

Niceの命名に関しては、非公開/保護されたプロパティの前には、パブリックではないことを明確にするためにアンダースコアが付きます。例えば。 private $_arr = array()またはpublic $arr = array()

18
James C

これを試して:

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

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

単純な配列の初期化:

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

配列内の配列の初期化:

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

ソース: コードのソース

4
improgrammer

他に方法はありません だから、これが一番です。

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

4
Matthieu Napoli