He trabajado en esto tanto tiempo que debo estar complicando demasiado una solución simple.

Dado lo siguiente en matrices

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

Salida deseada

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

El orden de la clave debe mantenerse.

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

Seguro que agradecería su ayuda.

1
Ron Kohn 29 ene. 2016 a las 00:49

2 respuestas

La mejor respuesta

Lo que realmente desea saber y conservar es el par clave / valor que difiere del valor anterior. Esto se puede hacer con una función simple

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

Esto devolverá lo que está preguntando cuando se le llama con collapse($in_num) o collapse($in_str).

0
Scott 28 ene. 2016 a las 22:22
<?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);

Salida:

Array
(
    [a] => 1
    [c] => 2
    [d] => 1
    [e] => 2
)
0
user557846user557846 28 ene. 2016 a las 22:31