通过值保留键折叠PHP数组元素(非唯一)

时间:2016-01-28 21:49:50

标签: php arrays

我对此工作了很长时间,以至于我必须使一个简单的解决方案复杂化。

在数组中给出以下内容

    $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.  

当然会感谢你的帮助。

2 个答案:

答案 0 :(得分: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)

返回您要求的内容

答案 1 :(得分: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
)