web-dev-qa-db-ja.com

PHPの文字列から重複を削除します

コンマで区切られた文字列内の重複値を削除する最速の方法を探しています。

したがって、私の文字列は次のようになります。

$str = 'one,two,one,five,seven,bag,tea';

文字列を値に分解して比較することはできますが、時間がかかると思います。 preg_replace()についてはどうですか?誰もこの機能を使ってそれをしましたか?

29
Adnan

最短のコードは次のとおりです。

$str = implode(',',array_unique(explode(',', $str)));

最速の場合...わかりませんが、おそらく明示的にループするよりも高速です。

参照: implodearray_uniqueexplode

119
Felix Kling

対処:_$string = 'one,two,one,five,seven,bag,tea';_

「アップスクリプト」の任意の時点で文字列を生成している場合は、重複が発生したときに削除する必要があります。

連結を使用して、次のような文字列を生成するとします。

_$string='';
foreach($data as $value){
    $string.=(strlen($string)?',':'').some_func($value);
}
_

...その後、デリミタ(カンマ)に基づいて_$string_から一意の値を抽出し、デリミタで再度分解する必要があります。


次のように、より直接的な方法を設計し、初期foreachループ内の重複を拒否することをお勧めします。

_foreach($data as $value){
    $return_value=some_func($value);  // cache the returned value so you don't call the function twice
    $array[$return_value]=$return_value;  // store the return value in a temporary array using the function's return value as both the key and value in the array.
}
$string=implode(',',$array);  // clean: no duplicates, no trailing commas
_

これは、重複する値の存在が許可されないため機能します。後続のすべてのオカレンスは、以前のオカレンスを上書きするために使用されます。配列には同じ配列(レベル)に2つの同一のキーがない場合があるため、この関数のないフィルターは機能します。

または、if(!isset($array[$return_value])){$array[$return_value]=$return_value;}を呼び出すことで、ループ内の配列データの「上書き」を回避できますが、違いは、繰り返しごとにisset()関数を呼び出すことです。これらの連想キー割り当てを使用する利点は、プロセスがin_array()よりも遅いisset()の使用を避けることです。

つまり、次のような2次元配列からデータの列を抽出する場合、

_$string='';
foreach($data as $value){
    $string.=(strlen($string)?',':'').$value['Word'];
}
_

次に、ループなしでarray_column()のマジックを活用できます like this

_echo implode(',',array_column($str,'Word','Word'));
_

そして最後に、マイクロ最適化に興味がある人のために、array_unique()の単一呼び出しは実際にはいくつかの2関数メソッドよりも遅いことに注意します。 こちらをご覧ください 詳細については。

要するに、このタスクを実行するには多くの方法があります。 _explode->unique->implode_は、区切られた文字列を生成していない場合、最も簡潔なメソッドである場合がありますが、最も直接的または最速のメソッドではない可能性があります。自分のタスクに最適なものを自分で選択してください。

0
mickmackusa