【问题标题】:Remove consecutive array with duplicate values in multidimensional array using PHP使用PHP删除多维数组中具有重复值的连续数组
【发布时间】:2019-11-09 00:30:57
【问题描述】:

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

我不知道该怎么做。

希望你能帮助我。

谢谢。

示例代码

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 
        ) 
    )

【问题讨论】:

  • 您要保留密钥吗?
  • 是的,请.....

标签: php arrays multidimensional-array duplicates


【解决方案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+3 相同时才会删除$i+2

希望这会有所帮助!

【讨论】:

  • 嗨,谢谢你的回答,我用我的示例数组测试你的代码,只有第一个连续的重复项(值为 25)工作,但值为 66 的数组不工作..
  • 是的,它是一团糟......对不起......虽然我试图修复它。 :p
  • 我认为它现在已修复。 @user123
【解决方案2】:

你可以这样处理

$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

【讨论】:

  • 嗨,先生,您能不能不删除数组中的“键”
  • @user123 key($r) 正在获取数组的最后一个键,表示最后一个元素数组,尝试执行此代码。
  • @user123 参考这个:php.net/manual/en/function.key.php
  • $array = [ ["key" =&gt; 0, "value" =&gt; 25], ["key" =&gt; 2, "value" =&gt; 25], ["key" =&gt; 3, "value" =&gt; 33], ["key" =&gt; 4, "value" =&gt; 45], ["key" =&gt; 5, "value" =&gt; 66], ["key" =&gt; 8, "value" =&gt; 66], ["key" =&gt; 9, "value" =&gt; 55], ]; 我的意思是输出应该是这样的......对不起
  • @user123 解决方案已更新为所需的结果。
【解决方案3】:

解决方法如下: 你的数组是这样的:

$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;
    }

【讨论】:

  • 感谢先生的回答,这行有错误$firstIndex = $this-&gt;search($item["value"], $array); 未捕获的错误:不在对象上下文中使用$this
【解决方案4】:

请试试这个希望它有效

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;
        }
    }
}

【讨论】:

    猜你喜欢
    • 2015-05-22
    • 2011-04-05
    • 2023-03-03
    • 2016-11-18
    • 1970-01-01
    • 1970-01-01
    • 2019-09-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多