2016-01-28 116 views
1

我已經在這個過程中工作了很長時間,以至於我必須將一個簡單的解決方案複雜化。按值保留鍵摺疊PHP數組元素(非唯一)

鑑於陣列

$in_num = array('a'=>1, 'b'=>1, 'c'=>2, 'd'=>1, 'e'=>2, 'f'=>2, 'g'=>2, 'h'=>2); 
    $in_str = array('a'=>'a', 'b'=>'a', 'c'=>'b', 'd'=>'a', 'e'=>'b', 'f'=>'b', 'g'=>'b); 

希望的輸出

$out_num = array('a'=>1, 'c'=>2, 'd'=>1, 'e'=>2); 
    $out_str = array('a'=>'a', 'c'=>'b', 'd'=>'a', 'e'=>'b'); 

鍵順序必須保持以下。

array('a'=>1, 'b'=>'str') does NOT occur. 

當然會感謝您的幫助。

+0

看不到任何其他選項比一個循環,即檢查前值 –

+0

array_unique返回1或一次,不是我要找的。我試過很多種類的循環,但無法工作,這就是爲什麼我問。 –

+0

我看到它像一個可摺疊集。 a1包含b1,d1和c2包含void,e2包含f2 g2 h2 –

回答

0

你真正想知道並保留的是與以前的值不同的鍵/值對。這可以用一個簡單的函數

function collapse($array = array()) { 
    //initialize the answer and previous value 
    $ans = array(); 
    $prevValue = null; 

    foreach($array as $key=>$val) { 
     //we only care if the current $val is different than the previous $value 
     if ($val != $prevValue) { 
      $ans[$key] = $val; 
     } 
     //save the current value as the previousValue for the next iteration 
     $prevValue = $val; 
    } 
    return $ans; 
} 

這將返回時collapse($in_num)collapse($in_str)叫你問來完成。

+0

這和龍的答案是一樣的,但是自從斯科特第一次來的時候,他得到了支票。謝謝你,我的頭痛已經結束了。 –

0
<?php 
$in_num = array('a'=>1, 'b'=>1, 'c'=>2, 'd'=>1, 'e'=>2, 'f'=>2, 'g'=>2, 'h'=>2); 

$previous = ''; 
foreach($in_num as $k=> $v){ 

    if($v !=$previous){ 
    $out[$k]=$v;  
    } 

$previous=$v; 

} 

print_r($out); 

輸出:

Array 
(
    [a] => 1 
    [c] => 2 
    [d] => 1 
    [e] => 2 
)