这是从阵列中删除重复的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;
答案 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
数组的长度等等)并且需要进行测试。以上是我认为在大多数情况下会更快,但我不是处理器;)
以上也意味着找到的第一个文件是保存的文件,而不是其他一些方法中找到的文件。