使用PHP删除多维数组中具有重复值的连续数组

时间:2019-06-27 03:07:01

标签: php arrays multidimensional-array duplicates

我正在研究一个过滤多维数组的函数,如果连续的数组具有相同的值,则需要删除它们之间的数组,并仅获取具有重复值的连续数组的第一个和最后一个。

我不知道该怎么做。

希望你能帮助我。

谢谢。

示例代码

function removeDuplicates($array){
    $result = [];
    $count = 0;
    $firstValue = null;

    for ($i = 0; $i < count($array); $i++) {

        if($array[$i]['id'] == firstValue){

            $result[] = $array[$i]);

        }else{

            // do action

        }

    }

    return $array;

}

样本数组

Array ( 
    [0] => Array ( 
        [key] => 0 
        [value] => 25 
        ) 
    [1] => Array ( 
        [key] => 1 
        [value] => 25 
        ) 
    [2] => Array ( 
        [key] => 2 
        [value] => 25 
        ) 
    [3] => Array ( 
        [key] => 3 
        [value] => 33 
        )    
    [4] => Array ( 
        [key] => 4 
        [value] => 45 
        ) 
    [5] => Array ( 
        [key] => 5 
        [value] => 66 
        ) 
    [6] => Array ( 
        [key] => 6 
        [value] => 66 
        ) 
    [7] => Array ( 
        [key] => 7 
        [value] => 66 
        ) 
    [8] => Array ( 
        [key] => 8 
        [value] => 66 
        ) 
    [9] => Array ( 
        [key] => 9 
        [value] => 55 
        ) 
    )

这里的前3个数组具有相同的值(25),我需要删除第2个数组并保留第1个和第3个数组,第6个到第9个数组仅保留第6个和第9个数组。

预期结果

Array ( 
    [0] => Array ( 
        [key] => 0 
        [value] => 25 
        )  
    [2] => Array ( 
        [key] => 2 
        [value] => 25 
        ) 
    [3] => Array ( 
        [key] => 3 
        [value] => 33 
        )    
    [4] => Array ( 
        [key] => 4 
        [value] => 45 
        ) 
    [5] => Array ( 
        [key] => 5 
        [value] => 66 
        ) 
    [8] => Array ( 
        [key] => 8 
        [value] => 66 
        ) 
    [9] => Array ( 
        [key] => 9 
        [value] => 55 
        ) 
    )

4 个答案:

答案 0 :(得分:1)

尝试一下:

$array = [
        ["key" => 0, "value" => 25],
        ["key" => 1, "value" => 25],
        ["key" => 2, "value" => 25],
        ["key" => 3, "value" => 33],
        ["key" => 4, "value" => 45],
        ["key" => 5, "value" => 66],
        ["key" => 6, "value" => 66],
        ["key" => 7, "value" => 66],
        ["key" => 8, "value" => 66],
        ["key" => 9, "value" => 55],
];

for ($i = 0; $i < count($array); $i++) {
    if (!isset($array[$i])){
        continue;
    }
    if ($array[$i]['value'] == $array[$i+1]['value']) {
        $j = 1;
        while ($array[$i]['value'] == $array[$i+$j+1]['value']) {
            unset($array[$i+$j]);
            $j += 1;
        }
    }
}

print_r($array);

由于您需要保留键,因此当未设置元素时,for循环将引发通知。这就是为什么我们首先检查元素是否存在。

然后,循环查找连续的两个相同值,即$i$i+1。一旦找到它们,它将进入while循环以测试3个或更多连续的相同值。仅当连续项之前和之后至少发生一次时,它才会取消设置连续项。例如,仅当$i+2相同时,它才会删除$i+3

希望这会有所帮助!

答案 1 :(得分:1)

您可以这样处理

$r = [];
$lastKey   = '';
foreach($array as $k => $v){ 
  if(in_array($v['value'], array_column($r, 'value'))){
    $lastKey = $v['key'];
  }else{
    if($lastKey && !in_array($lastKey, array_column($r, 'key'))){
        end($r);
        $r[] = [ 'key' => $lastKey, 'value' => $r[key($r)]['value']];
    }
    $r[]       = [ 'key' => $v['key'] , 'value' => $v['value'] ]; 
    $lastKey     = $v['key'];
  }
}

https://3v4l.org/f6FQv

答案 2 :(得分:0)

这是解决方案: 您的数组是这样的:

$array = [
            ["key" => 0, "value" => 25],
            ["key" => 1, "value" => 25],
            ["key" => 2, "value" => 25],
            ["key" => 3, "value" => 33],
            ["key" => 4, "value" => 45],
            ["key" => 5, "value" => 66],
            ["key" => 6, "value" => 66],
            ["key" => 7, "value" => 66],
            ["key" => 8, "value" => 66],
            ["key" => 9, "value" => 55],
        ];

首先,找到每个值的第一个和最后一个出现。 您需要一个遍历数组并找到确切值的方法。 看这个:

function search($search, $array)
    {
        foreach ($array as $key => $val) {
            if ($val['value'] === $search) {
                return $key;
            }
        }

        return null;
    }

运行$firstOccurrence = search(25, $array)将发现25的第一次出现。

现在,为了找到最后一次出现的索引,我们应该将数组反转为从数组末尾开始的行进。因此$lastOccurrence = search(25, array_reverse($array, true))将找到25的最后出现索引。

好的,当我们处理每个值时,因此,我们不应再次处理它。因此,我们需要一个数组来保存要处理的值。

最终代码:

function testArray()
    {
        $array = [
            ["key" => 0, "value" => 25],
            ["key" => 1, "value" => 25],
            ["key" => 2, "value" => 25],
            ["key" => 3, "value" => 33],
            ["key" => 4, "value" => 45],
            ["key" => 5, "value" => 66],
            ["key" => 6, "value" => 66],
            ["key" => 7, "value" => 66],
            ["key" => 8, "value" => 66],
            ["key" => 9, "value" => 55],
        ];
        $processedItems = [];
        $newArray = [];
        foreach ($array as $index => $item) {
            if (in_array($item["value"], $processedItems))
                continue;
            $processedItems[] = $item["value"];
            $firstIndex = search($item["value"], $array);
            $lastIndex = search($item["value"], array_reverse($array, true));
            $newArray[$firstIndex] = $array[$firstIndex];
            if ($firstIndex != $lastIndex)
                $newArray[$lastIndex] = $array[$lastIndex];
        }
        print_r($newArray);
    }

    function search($search, $array)
    {
        foreach ($array as $key => $val) {
            if ($val['value'] === $search) {
                return $key;
            }
        }

        return null;
    }

答案 3 :(得分:-1)

请尝试这一希望成功

for ($i = 0; $i < count($array); $i++) {
    if ($array[$i]['value'] == $array[$i+1]['value']) {
        $j = 1;
        while ($array[$i]['value'] == $array[$i+$j+1]['value']) {
            echo $array[$i]['value'].'==='.$array[$i+$j+1]['value'];
            unset($array[$i+$j]);
            $j += 1;
        }
    }
}