从数组中删除重复的strlen项?

时间:2013-02-26 17:57:57

标签: php arrays loops foreach

这是从阵列中删除重复的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 个答案:

答案 0 :(得分:6)

手动循环没有太多非常错误,尽管你的例子可能是:

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

PHP提供了大量有用的array functions

答案 1 :(得分: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()

答案 2 :(得分: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;
});

答案 3 :(得分: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数组的长度等等)并且需要进行测试。以上是我认为在大多数情况下会更快,但我不是处理器;)

以上也意味着找到的第一个文件是保存的文件,而不是其他一些方法中找到的文件。