删除数组中的连续重复项

时间:2019-06-25 08:43:02

标签: php arrays duplicates

我正在研究一个删除数组中重复项的函数。 该功能的不足之处在于,如果连续重复的内容少于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]

4 个答案:

答案 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));

演示: https://3v4l.org/mvjOq

  • 以上是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);