PHP, $ array [] = $ değer veya array_push ($ dizi, $ değer) 'de kullanmak daha iyi ne olabilir?


113

Bir dizi üyesini eklemek için PHP'de kullanmak daha iyi olan şey,

$array[] = $value;

veya

array_push($array, $value);

?

Kılavuz, bir işlev çağrısından kaçınmanın daha iyi olduğunu söylese de, okudum $array[]çok daha yavaş array_push(). Bazı açıklamalar veya ölçütler nelerdir?


2
$ myArray [] = 123; Bu array_push işlevinden daha hızlı olacaktır. Değeri doğrudan bu diziye ekler. Fonksiyonun bu değişkenler için ayrı bir yığını vardır. ve o işlevin içinde bu ifadeye sahip olabilir.
sganesh

Yanıtlar:


152

Kıyaslama yok, ama şahsen $array[]bakmanın daha temiz olduğunu düşünüyorum ve dizinize yüzbinlerce dizi eklemeyi planlamadığınız sürece saçları milisaniyeler içinde bölmek oldukça önemsizdir.

Düzenleme : Bu kodu çalıştırdı:

$t = microtime(true);
$array = array();
for($i = 0; $i < 10000; $i++) {
    $array[] = $i;
}
print microtime(true) - $t;
print '<br>';
$t = microtime(true);
$array = array();
for($i = 0; $i < 10000; $i++) {
    array_push($array, $i);
}
print microtime(true) - $t;

İlk kullanım yöntemi $array[], ikinciye göre neredeyse% 50 daha hızlıdır.

Bazı karşılaştırma sonuçları:

Run 1
0.0054171085357666 // array_push
0.0028800964355469 // array[]

Run 2
0.0054559707641602 // array_push
0.002892017364502 // array[]

Run 3
0.0055501461029053 // array_push
0.0028610229492188 // array[]

PHP el kitabında şunu belirttiği için bu şaşırtıcı olmamalıdır:

Diziye bir eleman eklemek için array_push () kullanırsanız, $ array [] = kullanmak daha iyidir çünkü bu şekilde bir işlevi çağırmanın ek yükü yoktur.

İfade edilme şekli array_push, birden çok değer eklerken daha verimli olursa şaşırmam . DÜZENLEME : Meraktan dolayı, bazı testler daha yaptı ve çok sayıda ekleme için bile, bireysel $array[]çağrılar bir büyükten daha hızlı array_push. İlginç.


Ben her zaman hangisinin en hızlı yol olduğunu bilmeyi tercih ederim, bu yüzden gün geldiğinde benden yüksek trafikli bir site oluşturmam istenecek, biraz fikir sahibi olacağım. Cevap için teşekkürler.
alex

10
Bunun gibi mikro optimizasyonlar nadiren çabaya değer. Sıfırdan yazıyorsanız, en mantıklı olanı yapın ve ancak o zaman, bir sayfa oluşturmak biraz yavaşsa profilinin profilini çıkarın. İşleri hızlandırmak için böyle bir şeyi değiştirmek zorunda kalmanın şansı çok az.
Alister Bulman

4
Sadece emin olmak için, kod $array[]çıktıyla uyuşmuyor gibi göründüğünden , makinemdeki 1M atamaları için bunun gerçekten çok daha hızlı olduğunu doğruladım: 300ms'ye karşı 2000ms. Bununla birlikte, array_push'a aynı anda 20 öğe eklemek yaklaşık 20 $array[] =sn. Kadar hızlıydı .
Elle

5
@AlisterBulman Mikro optimizasyonlar, tüm kod tabanınızı gözden geçirmeyi ve onu 'optimize etmeyi' düşünüyorsanız, çabaya değmez. Bununla birlikte, aynı şeyi yapmanın birkaç farklı yoluna sahipseniz ve bir yolun diğerlerinden daha iyi (biraz da olsa) olduğunun farkındaysanız, bu şekilde kullanmayı alışkanlık haline getirebilirsiniz. Bunu neden yapmadın?
Okonomiyaki3000

2
@AlisterBulman Kesinlikle katılmıyorum veya en azından kısmen, daha iyi biliyorsanız, daha iyi yazın , ancak olası mikro optimizasyonu aramak için fazla çaba sarf etmeyin ...
jave.web

42

Array_push () işlevinin ana kullanımı, dizinin sonuna birden çok değer gönderebilmenizdir.

Belgelerde şöyle yazıyor :

Diziye bir eleman eklemek için array_push () kullanırsanız, $ array [] = kullanmak daha iyidir çünkü bu şekilde bir işlevi çağırmanın ek yükü yoktur.


29

Gönderen için php docsarray_push :

Not: Diziye bir eleman eklemek için array_push () kullanırsanız, $ array [] = kullanmak daha iyidir çünkü bu şekilde bir işlevi çağırmanın ek yükü yoktur.


Cevabınızın ilk olması komik, ancak daha az oy kullanılıyor.
T.Woody

21

Sokaktaki kelime, işlev çağrısı için ek yük olmadığı için [] daha hızlıdır. Ayrıca, kimse PHP'nin dizi işlevlerini gerçekten sevmez ...

"Samanlık mı, iğne mi ... yoksa samanlık mı ... ah, lanet olsun ... [] ="


7
Ha? PHP'nin dizi işlevleri harika.
cletus

13
İşlevsel olarak harika, evet, ancak tutarsız adlandırma şemasına atıfta bulunuyordu.
ryeguy

2
IDE'nizde parametre ipuçlarını açmalısınız. Ama katılıyorum, biraz tutarlılık harika olurdu.
Pim Jager

4
Ben buna katılıyorum. Ne adlandırma şemasında (x_y veya xy veya y_x ...) ne de parametreler mantığında tutarlılık yoktur (hedef nesneyi önce, son olarak, diziler, dizeler ve normal ifadeler arasında geçirin , ortak bir kural bulmak için bol şans!).
e2-e4

3
FWIW, iğne / samanlık adlandırma kuralını seviyorum ve şu cümle ile aynı sırada gittiği için hatırlaması kolay buluyorum: "samanlıkta (2) bir iğne (1) bulmak gibi"
rybo111

8

Aralarındaki bir fark, array_push () işlevini ikiden fazla parametre ile çağırabilmenizdir, yani bir diziye aynı anda birden fazla eleman gönderebilirsiniz.

$myArray = array();
array_push($myArray, 1,2,3,4);
echo join(',', $myArray);

baskılar 1,2,3,4


2

Basit bir $ myarray [] bildirimi, bir işlevin getireceği ek yük olmaması nedeniyle bir öğeyi öğe yığınına iterken daha hızlı olacaktır.


2

" Array_push " bir işlev olduğundan ve döngü içindeyken birden çok kez çağrıldığından, yığına bir bellek ayıracaktır. Ama $ array [] = $ value kullandığımızda, o zaman diziye sadece değer atıyoruz.


1

İkincisi bir işlev çağrısıdır, bu nedenle genellikle çekirdek dizi erişim özelliklerini kullanmaktan daha yavaş olmalıdır. Ancak betiğinizdeki tek bir veritabanı sorgusunun bile 1.000.000 çağrıyı geride bırakacağını düşünüyorum array_push().


0

Soru daha çok performansla ilgili olsa da, insanlar bu soruya array_pushveya kullanmanın iyi bir uygulama olup olmadığını merak ederek gelecekler $arr[].

İşlev, birden çok değer için daha az satır anlamına gelebilir:

// 1 line:
array_push($arr, "Bob", "Steve");
// versus 2 lines:
$arr[] = "Bob";
$arr[] = "Steve";

Ancak , array_push...

  • dizi anahtarlarını alamıyor
  • sonları iğne / samanlık adlandırma kuralı
  • tartışıldığı gibi daha yavaştır

Yapışacağım $arr[].


0

Eklemek istemiyorum: int array_push(...)dizideki yeni eleman sayısını döndür ( php doc ). daha kullanışlı ve daha kompakt olabilir $myArray[] = ...; $total = count($myArray);.

Ayrıca array_push(...), değişken yığın olarak kullanıldığı zaman anlamlıdır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.