array_push()と$ array [] =の違い


117

PHPのマニュアルでは、(array_push)は述べています。

array_push()を使用して1つの要素を配列に追加する場合は、$ array [] =を使用することをお勧めします。この方法では、関数を呼び出すオーバーヘッドがないためです。

例えば ​​:

$arr = array();
array_push($arr, "stackoverflow");
print_r($arr);

$arr[] = "stackoverflow";
print_r($arr);

なぜ大きな違いがあるのか​​分かりません。


8
1つは関数呼び出しで、もう1つはそうではありません。箱に記載されているとおりです。
KingCrunch 2013年

1
1つは、上記の関数呼び出しです。これは、一部のリソースを使用して制御を関数呼び出しに切り替えたり、関数呼び出しから切り替えたりすることを意味します(その結果、オーバーヘッド処理が発生しました)。一方、後で新しい要素を配列にすぐに割り当てるだけです。
Ghazanfar Mir 2013

2
この質問により、アレイにプッシュする時間を
大幅に節約できました

回答:


151

PHPで関数(などarray_push())を呼び出すと、PHPが関数参照を検索し、メモリ内での位置を見つけて、定義されているコードを実行する必要があるため、呼び出しにオーバーヘッドが生じます。

の使用に$arr[] = 'some value';は関数呼び出しは不要であり、データ構造に直接追加を実装します。したがって、大量のデータを追加する場合、使用する方がはるかに高速でリソース効率が良い$arr[]です。


3
そのような表記 "$ arr [] = 'some value';" 機能の呼び出しに要約すると?
2014

1
@gekanntどうなるの?コメントの「何らかの値」が閉鎖であるということですか?これは、クロージャーの参照を配列に格納します。「何らかの値」が呼び出される関数である場合、その関数が返すものはすべて追加されます。
カークランド

@Kirkland演算子は、ほとんどのCライクな言語で代替構文を使用した関数です。私はPHPの専門家ではありませんが、C方言であるため、演算子を同じ方法で実装したと想像できます。
Kevin

1
@Kevin:私はあなたに同意します、そして私はPHPのドキュメントで次のようなコメントを見ているので、代替構文の背後にある関数が上記のものではないと確信しています:「array_push()を使用して1つの要素を追加した場合配列に対しては、$ array [] =を使用することをお勧めします。この方法では、関数を呼び出すオーバーヘッドがないからです。」検索エンジンが検索エンジンを少し混乱させるので、その背後にあるものを正確に確認する時間はありません:)
jnhghy-Alexandru Jantea

$arr[] = valueより速い実際の証拠はありますか?コンパイラがコードを別の方法で処理する理由を想像してみてください。
c ..

44

array_pushを使用して、1つのショットで複数の要素を配列に追加できます。

例えば array_push($array_name, $element1, $element2,...)

ここで、$ element1、$ element2、...は、配列に追加される要素です。

ただし、一度に1つの要素のみを追加する場合は、他の方法(つまり、$ array_name []を使用)をお勧めします。


プロジェクト全体で必要に応じて2つを組み合わせるのは悪い習慣ですか?
PBwebD 2016

1
@ testing123絶対にありません。読みやすさ、互換性などが著しく損なわれる場合(または特定のスタイルガイドに従う必要がある場合)を除いて、手元にある最も効率的なソリューションを使用することをお勧めします。
Chris Kraszewski 2017

15

違いは、「そのようにして関数を呼び出すオーバーヘッドがないため」という以下の行にあります。

array_push()最初の引数が配列でない場合、警告が発生します。これは$var[]、新しい配列が作成される動作とは異なります。


4
理由だとは言わなかった。質問では、違いが尋ねられ、これも違いです
Baig

7

$array[]ボックスには関数呼び出しのオーバーヘッドがないため、可能な限り常に使用する必要があります。したがって、関数呼び出しよりも少し高速です。


4

array_push — 1つまたは複数の要素を配列の最後にプッシュする

配列の最大サイズを取得する必要があることを使用してそれを行うには、「最後に1つ以上の要素」という単語に注意して$arr[]ください。


「$ ARRを使用して[]あなたは、配列の最大サイズを取得しなければならないことを実行します」。いいえ、あなたは$arr[...index...] = $value;ここで議論されているもの、つまりと混同しています$arr[] = $value;。最後にプッシュするために、サイズや配列を知る必要はありません。複数の要素は、単に複数の呼び出し、次のようになります $arr[] = $value1; $arr[] = $value2; $arr[] = $value3;
ToolmakerSteve

2

説明:1.最初の変数は配列で変数を宣言します。

2. 2番目のarray_pushメソッドを使用して、配列変数に文字列をプッシュします。

3.最後に結果を出力します。

4. 2番目の方法は、文字列を配列に直接格納することです。

5.print_rメソッドを使用して、データを配列値に出力します。

この二つは同じです


1

どちらも同じですが、array_pushは配列であるパラメーターでループを作成し、$ array [] = $ elementを実行します


0

私はこれが古い答えであることを知っていますが、2つ間のもう1つの違いは、ループごとに2/3を超える値を配列に追加する必要がある場合、より速く使用できるということを他の人が知るのに役立つかもしれません:

     for($i = 0; $i < 10; $i++){
          array_push($arr, $i, $i*2, $i*3, $i*4, ...)
     }

の代わりに:

     for($i = 0; $i < 10; $i++){
         $arr[] = $i;
         $arr[] = $i*2;
         $arr[] = $i*3;
         $arr[] = $i*4;
         ...
     }

編集- for条件のブラケットを閉じるのを忘れた


1
これはarray_mergeとどのように比較されるのでしょうか。例えばfor(...){ $arr = $arr + [$i, $i*2, $i*3, $i*4, ...] }。私はarray_pushはまだそれより少し速いと推測しています。
ToolmakerSteve

0

誰も言っていませんが、array_pushは要素をアレイの終わりにプッシュするだけで、$ array [index]は任意のインデックスに値を挿入できます。大きな違い。


問題は、「array_push()と$ array [] = "の違いです。私が言ったことは1つの違いです。大きい!
Marco

1
私は敬意を払いません。あなたが説明$array[index] = しているのは、とは異なる操作です$array[] = ...。質問は2つのコードを提供し、なぜそれらの間で[パフォーマンス]に大きな違いあるのかを尋ねます。質問は文字通りを意味します$array[] = ...。これは特定のphpイディオムであり、インデックスを含みません。array + indexは別の問題を解決し、別のコードを生成し、別のトレードオフです。
ToolmakerSteve
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.