Buscar valores repetidos en array multidimensional (PHP)

publicado por: Anonymous

Como puedo sacar los valores repetidos dentro de un array multidimensional en PHP? He encontrado algunas funciones pero no me han funcionado. Hay alguna función nativa que haga eso?

<?php
$array = array(array(7,18), array(12,7), array(12, 7, 13));
$result = array();


$first = $array[0];
for($i=1; $i<count($array); $i++){
 $result = array_intersect ($first, $array[$i]);
 $first = $result;
}
print_r($result);//7
?>

function array_icount_values($arr,$lower=true) { 
     $arr2=array(); 
     if(!is_array($arr['0'])){$arr=array($arr);} 
     foreach($arr as $k=> $v){ 
      foreach($v as $v2){ 
      if($lower==true) {$v2=strtolower($v2);} 
      if(!isset($arr2[$v2])){ 
          $arr2[$v2]=1; 
      }else{ 
           $arr2[$v2]++; 
           } 
    } 
    } 
    return $arr2; 
} 

$arr = array_icount_values($arry);

echo "<pre>";
print_r($arr);
exit;

He encontrado esto en Stackoverflow pero no me funciona ni una ni otra.

solución

Si tienes php5.6:

<?php
// Array multidimensional
$a = [
  [1,2,3,4,5,6, 33], 
  [1,2,5,6,7,9], 
  [3,4,1,2,8,5, 
    [1,2,3,9, 
      [8, 
        [34]
      ]
    ] , 
    33, 34
  ]
];

// Primero hacemos la matriz de una sola dimensión
$b = [];
array_walk_recursive($a, function($a) use (&$b) {
  $b[] = $a;
});

/* En caso de ser un array de 2 dimensiones podemos usar
$b = call_user_func_array('array_merge', $a);
ó
$b = array_merge(...$a); <-- en el caso de utilizar PHP > 5.6

*/ 

// array_count_values: cuenta cada valor retornando un array (valor => cantidad)
// luego filtramos los que tengan un valor > 1
// luego recuperamos las keys (que son los valores originales
$repetidos = array_keys(
               array_filter(
                 array_count_values($b), function($v, $k) {
                   return $v > 1;
               }, ARRAY_FILTER_USE_BOTH)
             ); // es necesario PHP 5.6 para utilizar tanto keys como values en array_filter

var_dump($repetidos);

// OUTPUT:
array(6) {
  [0]=>
  int(1)
  [1]=>
  int(2)
  [2]=>
  int(3)
  [3]=>
  int(4)
  [4]=>
  int(5)
  [5]=>
  int(6)
}
Respondido por: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *