从多维php数组中删除重复项

从多维php数组中删除重复项,php,arrays,Php,Arrays,我有一个数组结构,我如何处理它,以便删除所有连续出现的change_status。请看下面的数组,然后是我想要实现的 $a=array( "0" => array( "status_change" => "start", "clock_status" => "1" ), "1" => array( "status_change" => "stop", "clock_status" => "2" ), "2" => array

我有一个数组结构,我如何处理它,以便删除所有连续出现的change_status。请看下面的数组,然后是我想要实现的

$a=array( 
    "0" => array(  "status_change" => "start", "clock_status" => "1" ),
    "1" => array(  "status_change" => "stop", "clock_status" => "2" ),
    "2" => array(  "status_change" => "stop", "clock_status" => "2" ),
    "3" => array(  "status_change" => "stop", "clock_status" => "2" ),
    "4" => array(  "status_change" => "stop", "clock_status" => "2" ),
    "5" => array(  "status_change" => "stop", "clock_status" => "2" ),
    "6" => array(  "status_change" => "stop", "clock_status" => "2" ),
    "7" => array(  "status_change" => "start", "clock_status" => "1" ),
    "8" => array(  "status_change" => "stop", "clock_status" => "2" ),
    "9" => array(  "status_change" => "start", "clock_status" => "1" ),
    "10" => array(  "status_change" => "start", "clock_status" => "1" ),
    "11" => array(  "status_change" => "start", "clock_status" => "1" ),
    "12" => array(  "status_change" => "start", "clock_status" => "1" )
    );
在处理了上面的数组之后,我希望有以下内容

$a=array( 
    "0" => array(  "status_change" => "start", "clock_status" => "1" ),
    "1" => array(  "status_change" => "stop", "clock_status" => "2" ),
    "7" => array(  "status_change" => "start", "clock_status" => "1" ),
    "8" => array(  "status_change" => "stop", "clock_status" => "2" ),
    "9" => array(  "status_change" => "start", "clock_status" => "1" )
    );

如有任何意见,将不胜感激。我确实有一个处理一维数组的代码,但是这个代码让我感到困惑,而且我在处理数组时有点慢。

在跟踪上一个元素的同时迭代数组。如果当前元素等于上一个元素,请将其删除:

$previous = null;
foreach ($a as $key => $value) {
    if ($value === $previous) {
        unset($a[$key]);
    }
    $previous = $value;
}

请注意,我选择使用identity操作符
===
来比较上一个值和当前值,因为这看起来最适合您提供的数据。如果数据格式可能不同,则需要使用更宽松的比较形式。

当然,对于此类任务,您可以使用唯一的对象和数组:

<?php
class Test
{
    public $key;
    public $value;
    private $group;
    public function __construct($k,$v,$group=0)
    {
        $this->key=$k;
        $this->value=$v;
            $this->group=$group;
    }
    public function __toString()
    {
        return$this->key."_".$this->value."_".$this->group;
    }
}
$arr=array();
$arr[]=new Test("start",1);
$arr[]=new Test("stop",2);
$arr[]=new Test("stop",2);
$arr[]=new Test("stop",2);

$arr=array_unique($arr);
print_r($arr);
?>


对于每个“开始”键,您可以增加组迭代器。

请检查以下代码

$source=array( 
    "0" => array(  "status_change" => "start", "clock_status" => "1" ),
    "1" => array(  "status_change" => "stop", "clock_status" => "2" ),
    "2" => array(  "status_change" => "stop", "clock_status" => "2" ),
    "3" => array(  "status_change" => "stop", "clock_status" => "2" ),
    "4" => array(  "status_change" => "stop", "clock_status" => "2" ),
    "5" => array(  "status_change" => "stop", "clock_status" => "2" ),
    "6" => array(  "status_change" => "stop", "clock_status" => "2" ),
    "7" => array(  "status_change" => "start", "clock_status" => "1" ),
    "8" => array(  "status_change" => "stop", "clock_status" => "2" ),
    "9" => array(  "status_change" => "start", "clock_status" => "1" ),
    "10" => array(  "status_change" => "start", "clock_status" => "1" ),
    "11" => array(  "status_change" => "start", "clock_status" => "1" ),
    "12" => array(  "status_change" => "start", "clock_status" => "1" )
    );

function reduce_successive(&$source) {      
    $prev_status = 'none';
    foreach($source as $key=>$item) {
        if($item['status_change'] == $prev_status) {
            unset($source[$key]);
        } else {
            $prev_status = $item['status_change'];
        }
    }
}
reduce_successive($source);
var_dump( $source );

你不久前问过这个问题。哦,我没看那个,非常感谢你的帮助,这不是真正的“数组删除重复”。。。因为他想用逻辑删除重复条目。。。删除所有重复项预期结果将是一个包含2项的数组,而不是他想要的。Hi@Chibueze Opata另一个函数工作,但我想要另一个可以在多维数组上工作的函数这真的会删除所有重复项吗?还是仅仅是那些排成一行的?我想您错过了在中为
$previous
赋值的行loop@insanebits:那些排成一行的,就像问题上说的“连续的重复”。哦,很抱歉错过了这一个:)非常感谢Jon:-)工作得很有魅力:)关于如何使用递归做这件事有什么想法吗?