2013-07-18 134 views
-2

我有一個如下的數組結構我該如何處理它,以便刪除所有連續發生的change_status。請看下面的數組,然後我想實現。從多維php數組中刪除重複的條目

$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") 
    ); 

任何想法將不勝感激。我有一個處理一維數組的代碼,但這個讓我感到困惑,而且在處理數組時我有點慢。

+3

你問這個問題,前不久檢查。 [發生了什麼事在這裏回答?](http://stackoverflow.com/a/17712070/612717) –

+0

哦,沒有看到,非常感謝你的幫助球員 –

+0

這不是一個真正的「陣列刪除重複」。 ..因爲他想用邏輯刪除重複的條目...刪除所有的重複項預期的結果將是一個2項的數組,而不是他想要的。 – MiPnamic

回答

0

請下面的代碼

$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

在跟蹤上一個元素的同時迭代整個數組。如果當前元素是等於以前,將其刪除:我選擇使用的身份運營商===比較以前和當前值,因爲這看起來最恰當不過了你給的數據

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

注意。如果數據格式可能會有所不同,則需要使用較爲寬鬆的比較形式。

+0

工作這將真正刪除所有重複?或只有那些連續的? – insanebits

+1

我想你錯過了在循環中爲'$ previous'賦值的行 –

+0

@insanebits:連續的,因爲問題是「連續重複」。 – Jon

0

當然你也可以使用對象和array_unique對於這樣的任務:

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

併爲每個「開始」鍵就可以增加你的小組迭代器。