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 回答