2013-04-10 4 views
10

私はで疑問使用するために何をしています:使用する方が良い:in_arrayまたはarray_unique?

foreach(){ 
    // ..... 

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

    // .... 
} 

OR

foreach(){ 
    // ..... 

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

    // .... 
} 

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

UPDATE

目標は、ユニークな値の配列を取得することです。これは、値がすでにin_arrayで存在するかどうかを毎回チェックするか、毎回すべての値を追加し、最後にarray_uniqueを使用して行うことができます。この2つの方法の間に大きな違いがありますか?

+0

... 'in_array'は私が知っている@DarylGill配列の値に検索を提供し、見つかった/ –

+2

を見つけていない場合はfalse /真を返す' array_unique'が与えられた配列内の重複する値を削除し、ドキュメントを読んでこの関数はありますが、提供されている例のほうが良いかどうかを知りたい場合 – user1692333

+0

なぜこれらの2つの関数に悩まされているのか、十分な情報が提供されていないのですか? –

答えて

7

私は第2のアプローチがより効率的だと思います。実際、array_uniqueは配列をソートしてスキャンします。

ソートはN log Nステップで実行され、次にスキャンにはNステップがかかります。

最初のアプローチでは、N^2ステップ(foreach要素はN個前のすべての要素をスキャンします)が必要です。大きな配列では、非常に大きな違いがあります。

+1

+1となるように 'in_array'をチェックするために' O(n^2) 'ではなく' O(n)+ O(n log(n)) 'となります。ここでは、良いスクリプト(スニペット)をミリ秒単位で比較しています:https://gist.github.com/Ocramius/7453564 –

2

正直、小さなデータセットを使用している場合は、どちらを使用するかは関係ありません。あなたのデータセットが10000sの場合は、この種のハッシュマップを使用したいと思うでしょう。

これは、ビューが文字列であるかのように見えます。 これは一般的にO(n)であり、おそらく一意の値を追跡するための最も速い方法です。

foreach($views as $view) 
{ 
    if(!array_key_exists($view,$unique_views)) 
    { 
     $unique_views[$condition][$view] = true; 
    } 
} 
関連する問題