valores - eliminar duplicados array multidimensional php
¿Cómo eliminar los valores duplicados de una matriz multidimensional? (4)
Tengo datos de matriz de dos consultas separadas de mysql. Los datos de la matriz se muestran a continuación:
0
:
{user_id: 82, ac_type: 1,…}
1
:
{user_id: 80, ac_type: 5,…}
2
:
{user_id: 76, ac_type: 1,…}
3
:
{user_id: 82, ac_type: 1,…}
4
:
{user_id: 80, ac_type: 5,…}
Quiero eliminar los elementos de matriz duplicados.
Por lo tanto, mi salida será así:
0
:
{user_id: 82, ac_type: 1,…}
1
:
{user_id: 80, ac_type: 5,…}
2
:
{user_id: 76, ac_type: 1,…}
Quiero verificar el duplicado por ID_usuario.
He intentado las siguientes soluciones, pero ninguna de ellas funciona como se desea.
$input = array_unique($res, SORT_REGULAR);
$input = array_map("unserialize", array_unique(array_map("serialize", $res)));
También intenté abajo.
$results = array();
foreach ($res as $k => $v) {
$results[implode($v)] = $v;
}
$results = array_values($results);
print_r($results);
Pero aún existen datos duplicados.
Me tomó un tiempo, pero esto debería funcionar (explicación en los comentarios):
<?php
/* Example array */
$result = array(
0 => array(
"user_id" => 82,
"ac_type" => 1
),
1 => array(
"user_id" => 80,
"ac_type" => 5
),
2 => array(
"user_id" => 76,
"ac_type" => 1
),
3 => array(
"user_id" => 82,
"ac_type" => 2
),
4 => array(
"user_id" => 80,
"ac_type" => 2
)
);
/* Function to get the keys of duplicate values */
function get_keys_for_duplicate_values($my_arr, $clean = false) {
if ($clean) {
return array_unique($my_arr);
}
$dups = $new_arr = array();
foreach ($my_arr as $key => $val) {
if (!isset($new_arr[$val])) {
$new_arr[$val] = $key;
} else {
if (isset($dups[$val])) {
$dups[$val][] = $key;
} else {
//$dups[$val] = array($key);
$dups[] = $key;
// Comment out the previous line, and uncomment the following line to
// include the initial key in the dups array.
// $dups[$val] = array($new_arr[$val], $key);
}
}
}
return $dups;
}
/* Create a new array with only the user_id values in it */
$userids = array_combine(array_keys($result), array_column($result, "user_id"));
/* Search for duplicate values in the newly created array and return their keys */
$dubs = get_keys_for_duplicate_values($userids);
/* Unset all the duplicate keys from the original array */
foreach($dubs as $key){
unset($result[$key]);
}
/* Re-arrange the original array keys */
$result = array_values($result);
echo ''<pre>'';
print_r($result);
echo ''</pre>'';
?>
La función fue tomada de esto la respuesta a esta pregunta: Obtener las claves para los valores duplicados en una matriz
Salida:
Array
(
[0] => Array
(
[user_id] => 82
[ac_type] => 1
)
[1] => Array
(
[user_id] => 80
[ac_type] => 5
)
[2] => Array
(
[user_id] => 76
[ac_type] => 1
)
)
No necesita llamadas a funciones personalizadas para esta tarea. Simplemente use array_column()
para asignar nuevas claves temporales a cada subcampo, luego reindexe los subarreglos e imprima en pantalla. * esto sobrescribe las ocurrencias anteriores con las posteriores.
Código: ( Demo )
$array=[
[''user_id''=>82,''ac_type''=>1],
[''user_id''=>80,''ac_type''=>5],
[''user_id''=>76,''ac_type''=>1],
[''user_id''=>82,''ac_type''=>2],
[''user_id''=>80,''ac_type''=>6]
];
var_export(array_values(array_column($array,NULL,''user_id'')));
Salida:
array (
0 =>
array (
''user_id'' => 82,
''ac_type'' => 2,
),
1 =>
array (
''user_id'' => 80,
''ac_type'' => 6,
),
2 =>
array (
''user_id'' => 76,
''ac_type'' => 1,
),
)
Si desea mantener las primeras apariciones e ignorar todos los duplicados posteriores, esto hará:
Código: ( Demo ) (* esto mantiene las primeras apariciones)
$array=[
[''user_id''=>82,''ac_type''=>1],
[''user_id''=>80,''ac_type''=>5],
[''user_id''=>76,''ac_type''=>1],
[''user_id''=>82,''ac_type''=>2],
[''user_id''=>80,''ac_type''=>6]
];
foreach($array as $a){
if(!isset($result[$a[''user_id'']])){
$result[$a[''user_id'']]=$a; // only store first occurence of user_id
}
}
var_export(array_values($result)); // re-index
Salida:
array (
0 =>
array (
''user_id'' => 82,
''ac_type'' => 1,
),
1 =>
array (
''user_id'' => 80,
''ac_type'' => 5,
),
2 =>
array (
''user_id'' => 76,
''ac_type'' => 1,
),
)
Si no le importa perder el orden de sus submatrices, puede usar array_reverse()
con array_column()
para retener las primeras ocurrencias usando claves temporales, luego use array_values()
para volver a indexar:
var_export(array_values(array_column(array_reverse($array),NULL,''user_id'')));
/*
array (
0 =>
array (
''user_id'' => 76,
''ac_type'' => 1,
),
1 =>
array (
''user_id'' => 82,
''ac_type'' => 1,
),
2 =>
array (
''user_id'' => 80,
''ac_type'' => 5,
),
)
*/
Probado y ejemplo de trabajo.
<?php
$details = array(''0''=> array(''user_id''=>''82'', ''ac_type''=>''1''), ''1''=> array(''user_id''=>''80'', ''ac_type''=>''5''), ''2''=>array(''user_id''=>''76'', ''ac_type''=>''1''), ''3''=>array(''user_id''=>''82'', ''ac_type''=>''1''), ''4''=>array(''user_id''=>''80'', ''ac_type''=>''5''));
function unique_multidim_array($array, $key) {
$temp_array = array();
$i = 0;
$key_array = array();
foreach($array as $val) {
if (!in_array($val[$key], $key_array)) {
$key_array[$i] = $val[$key];
$temp_array[$i] = $val;
}
$i++;
}
return $temp_array;
}
?>
<?php
$details = unique_multidim_array($details,''user_id'');
?>
<pre>
<?php print_r($details); ?>
</pre>
Se producirá:
Array
(
[0] => Array
(
[user_id] => 82
[ac_type] => 1
)
[1] => Array
(
[user_id] => 80
[ac_type] => 5
)
[2] => Array
(
[user_id] => 76
[ac_type] => 1
)
)
tomado de aquí http://php.net/manual/en/function.array-unique.php en las notas aportadas por el usuario.
$array = [
[''user_id''=>82,''ac_type''=>1],
[''user_id''=>80,''ac_type''=>5],
[''user_id''=>76,''ac_type''=>1],
[''user_id''=>82,''ac_type''=>2],
[''user_id''=>80,''ac_type''=>6]
];
$array = array_reverse($array);
$v = array_reverse(
array_values(
array_combine(
array_column($array, ''user_id''),
$array
)
)
);
echo ''<pre>'';
var_dump($v);
Resultado:
array(3) {
[0]=>
array(2) {
["user_id"]=>
int(76)
["ac_type"]=>
int(1)
}
[1]=>
array(2) {
["user_id"]=>
int(82)
["ac_type"]=>
int(1)
}
[2]=>
array(2) {
["user_id"]=>
int(80)
["ac_type"]=>
int(5)
}
}