2

これは、配列から重複する strlen 項目を取り除くための最も簡単な方法ですか? 私はこれと同様のタスクを行うプログラミングをたくさん行っています。そのため、複雑すぎるのか、それともこれが最も簡単な方法なのかを尋ねています。

$usedlength = array();
$no_duplicate_filesizes_in_here = array();
foreach ($files as $file) {
    foreach ($usedlength as $length) {
        if (strlen($file) == $length) continue 2;
    }
    $usedlength[] = strlen($file);
    $no_duplicate_filesizes_in_here[] = $file;
}
$files = $no_duplicate_filesizes_in_here;
4

4 に答える 4

6

あなたの例は次のようになりますが、手動でループすることには大きな問題はありません。

$files = array_intersect_key($files, array_unique(array_map('strlen', $files)));

PHP には、便利な配列関数が多数用意されています。

于 2013-02-26T18:19:24.473 に答える
1

これを試すことができます:

$no_duplicate_filesizes_in_here = array();
for ($i=count($files)-1;$i>=0;$i--){
  $no_duplicate_filesizes_in_here[strlen($files[$i])] = $file;
}
$files = array_values($no_duplicate_filesizes_in_here);
// if you don't care about the keys, don't bother with array_values()
于 2013-02-26T18:13:02.243 に答える
0

PHP 5.3以降を使用している場合、array_filterはこれを行うための優れた構文を提供します。

$nodupes = array_filter($files, function($file) use (&$lengths) {
    if (in_array(strlen($file), (array) $lengths)) {
        return false;
    }

    $lengths[] = strlen($file);
    return true;
});
于 2013-02-26T18:23:03.600 に答える
0

他のいくつかの回答ほど短くはありませんが、別のアプローチはキーベースのルックアップを使用することです:

$used = array();
$no_dupes = array();
foreach ($files as $file) {
  if ( !array_key_exists(($length = strlen($file)), $used) ) {
    $used[$length] = true;
    $no_dupes[] = $file;
  }
}

これには、重複を保存するのに時間を無駄にしないという追加のボーナスがあります (後で上書きするためだけです)。ただし、このループが PHP の組み込み配列メソッドの一部よりも高速であるかどうかは、おそらくいくつかの要因 (重複の数、配列の長さなどfiles)、テストする必要があります。上記は、ほとんどの場合、より高速であると私が想定するものですが、私はプロセッサーではありません;)

上記は、他のいくつかのアプローチで最後に見つかったファイルではなく、最初に見つかったファイルが保持されることも意味します。

于 2013-02-26T18:38:49.660 に答える