Php 是否从阵列中删除重复的strlen项?

Php 是否从阵列中删除重复的strlen项?,php,arrays,loops,foreach,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;

这是从数组中删除重复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;
您可以尝试以下方法:

$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()
手动循环没有太大的错误,尽管您的示例可能是:

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

PHP提供了大量有用的工具。

如果您使用的是PHP5.3或更高版本,则提供了一种很好的语法:

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

    $lengths[] = strlen($file);
    return true;
});

没有其他答案那么简短,但另一种方法是使用基于键的查找:

$used = array();
$no_dupes = array();
foreach ($files as $file) {
  if ( !array_key_exists(($length = strlen($file)), $used) ) {
    $used[$length] = true;
    $no_dupes[] = $file;
  }
}
这将有一个额外的好处,即不会在存储重复项上浪费时间(只会在以后覆盖它们),但是,这个循环是否会比PHP的一些内置数组方法更快,可能取决于许多因素(重复项的数量、
文件的长度
数组等等),需要进行测试。以上是我认为在大多数情况下更快的方法,但我不是处理器;)


上述情况也意味着找到的第一个文件是保留的文件,而不是在某些其他方法中找到的最后一个文件。

可能更适合于以下情况:如果所有文件似乎都以字符串形式加载,那么最好使用方法
filesize
?或者说文件大小是指文件名的长度吗?它的图像按文件内容加载到数组中。啊,谢谢你的澄清。首先使用
filesize
可能会更快(以限制最终作为字符串加载的图像),但这完全取决于您试图编写的代码。我指的是count(),不是len(),但无论如何。它只计算一次,因为它只分配给i一次。我使用for(I)迭代器,以便向后查看数组,以便最终结果与原始代码匹配。(i)和foreach()之间的性能差异几乎总是可以忽略不计的——真正的性能问题是循环次数超过了必须的次数。很好,但请记住,这两个键是不同的。如果希望键是连续的,则需要将其包装在array_values()中。@minboost故意这样做,如果对键感兴趣,则通常需要的是原始键。OP没有提到以这种或那种方式关心密钥。基于原始代码,不需要原始密钥。我明白这可能并不重要,但每当我重构代码时,我都会确保最终结果是相同的,否则我会注意到它不是相同的。@minboost,有一个经过深思熟虑的(即使是微妙的)词语选择,我说“你的例子可能是”。如果我的例子是完全复制OP的,我会这么说