2013-04-10 32 views
10

Ben şüphe kullanmak neyim:Kullanımı daha iyi olan: in_array veya array_unique?

foreach(){ 
    // ..... 

    if(!in_array($view, $this->_views[$condition])) 
     array_push($this->_views[$condition], $view); 

    // .... 
} 

VEYA

foreach(){ 
    // ..... 

    array_push($this->_views[$condition], $view); 

    // .... 
} 

$this->_views[$condition] = array_unique($this->_views[$condition]); 

GÜNCELLEME

gol benzersiz değerlerin dizisini elde etmektir. Bu, in_array ile zaten mevcutsa veya her seferinde değer eklediğinde ve son olarak array_unique kullanınca her seferinde kontrol edilerek yapılabilir. Yani bu iki yol arasında büyük bir fark var mı?

+0

belgelerini okuyun 'array_unique' in_array' dizisi değerlere bir arama sağlar' ... Verilen dizi içinde yinelenen değerleri kaldırır ve döndüren bir doğru/yanlış –

+2

biliyorum @DarylGill neyi Bu işlevler, ancak sağlanan örneklerin hangisinin daha iyi olduğunu bilmek istiyorum – user1692333

+0

Bu iki işlevle ne sıklıkta takıldığınızı, hangi bağlamda kullanıldığını vb. yeterince bilgi vermediniz. –

cevap

7

İkinci yaklaşımın daha verimli olacağını düşünüyorum. Aslında, array_unique diziyi sıralar ve sonra tarar.

Sıralama, N log N adımlarında yapılır, ardından tarama N adımı alır.

İlk yaklaşım N^2 adımını alır (foreach öğesi, önceki tüm N öğelerini tarar). Büyük dizilerde çok büyük bir fark var.

+1

+1 'in' ini kontrol etmek için 'O (n^2)' yerine O (n) + O (n log (n)) 'olacaktır. İşte milisaniye cinsinden karşılaştırmalı iyi bir betik (snippet): https://gist.github.com/Ocramius/7453564 –

2

Dürüst bir şekilde küçük bir veri kümesi kullanıyorsanız, hangisini kullandığınız önemli değildir. Veri kümeniz 10000'lerde ise, kesinlikle bu tür şeyler için bir karma harita kullanmak isteyeceksiniz.

Bu, görünümlerin olduğu gibi göründüğü bir dize veya bir şey olduğu varsayılmaktadır. Bu, tipik olarak O (n) ve muhtemelen benzersiz değerleri izleme ile baş etmenin en hızlı yoludur. Bulunan/bulunmazsa eğer

foreach($views as $view) 
{ 
    if(!array_key_exists($view,$unique_views)) 
    { 
     $unique_views[$condition][$view] = true; 
    } 
} 
İlgili konular