我正在研究一个删除数组中重复项的函数。 该功能的不足之处在于,如果连续重复的内容少于5个,它将保留,而大于5个将成为一个数字。
我的问题是无法弄清楚逻辑。
希望你能帮助我。
谢谢。
示例代码
function removeDuplicates($array){
$result = array();
$lastVal = null;
$temp_array = array();
foreach ($array as $key => $value) {
# code...
if($value != $firstVal){
$result[] = $value;
}else{
$temp_array[] = $value;
}
$lastVal = $value;
}
return $result;
}
样本
$array = array(1,2,4,1,1,1,1,0,8,7,2,0,0,8,8,8,8,8,8,8,2,4,1,5);
预期结果
[1,2,4,1,1,1,1,0,8,7,2,0,0,8,2,4,1,5]
答案 0 :(得分:2)
此处:
<?php
$array = array(1,2,4,1,1,1,1,0,8,7,2,0,0,8,8,8,8,8,8,8,2,4,1,5);
$test = removeDuplicates($array);
echo '<pre>';
var_dump($test);
function removeDuplicates($array){
$result = [];
$count = 1;
for ($i = 1; $i <= count($array)-1; $i++) {
if ($array[$i] == $array[$i - 1]) {
$count++;
} else {
if ($count >= 5) {
array_splice($array, $i-$count, $count-1);
}
$count = 1;
}
}
return $array;
}
输出:
array(18) {
[0]=>
int(1)
[1]=>
int(2)
[2]=>
int(4)
[3]=>
int(1)
[4]=>
int(1)
[5]=>
int(1)
[6]=>
int(1)
[7]=>
int(0)
[8]=>
int(8)
[9]=>
int(7)
[10]=>
int(2)
[11]=>
int(0)
[12]=>
int(0)
[13]=>
int(8)
[14]=>
int(2)
[15]=>
int(4)
[16]=>
int(1)
[17]=>
int(5)
}
答案 1 :(得分:2)
<?php
function removeDuplicates($array){
$freq = 5;
$result = [];
$size = count($array);
$counts = [];
for($i=0;$i<$size;++$i) $counts[] = 0;
$counts[$size-1] = 1;
for($i=$size-2;$i>=0;--$i){
$counts[$i] = 1;
if($array[$i] === $array[$i+1]) $counts[$i] = $counts[$i+1] + 1;
}
for($i=0;$i<$size;++$i){
$result[] = $array[$i];
if($counts[$i] >= $freq){
$i += $counts[$i] - 1;
}
}
return $result;
}
$array = array(1,2,4,1,1,1,1,0,8,7,2,0,0,8,8,8,8,8,8,8,2,4,1,5);
print_r(removeDuplicates($array));
以上是O(n)算法(具有O(n)额外空间),在此算法中,我们首先预先计算当前数字连续具有的计数。
现在,当再次进行迭代时,我们检查当前数组的编号是否具有count value >= frequency
。在这里,频率为5
。
如果计数小于频率,则通常进行迭代。否则,我们将直接跳到下一个有价值的数字,以$count[$i]
中存储的特定数字的频率进行处理。即使您选择的频率为1000或更高,此方法也可以使用。
答案 2 :(得分:0)
作为选择
removeDuplicates(array(1,2,4,1,1,1,1,0,8,7,2,0,0,8,8,8,8,8,8,8,2,4,1,5));
function removeDuplicates($arr){
$count_duplicates = 0;
foreach ($arr as $key => $item){
if($item == $arr[$key+1]){
$count_duplicates++;
}else{
if($count_duplicates >= 5){
for($i = 0; $i < $count_duplicates; $i++){
unset($arr[$key-$i]);
}
}
$count_duplicates = 0;
}
}
return $arr;
}
答案 3 :(得分:-2)
应该是这样
$ array = array(“ 1”,“ 2”,“ 3”,“ 4”,“ 5”,“ 4”,“ 2”,“ 1”);
$ result = array_unique($ array);