Cómo eliminar valores duplicados de una matriz multidimensional en PHP

Resuelto Ian asked hace 54 años • 18 respuestas

¿Cómo puedo eliminar valores duplicados de una matriz multidimensional en PHP?

Matriz de ejemplo:

Array
(
    [0] => Array
    (
        [0] => abc
        [1] => def
    )

    [1] => Array
    (
        [0] => ghi
        [1] => jkl
    )

    [2] => Array
    (
        [0] => mno
        [1] => pql
    )

    [3] => Array
    (
        [0] => abc
        [1] => def
    )

    [4] => Array
    (
        [0] => ghi
        [1] => jkl
    )

    [5] => Array
    (
        [0] => mno
        [1] => pql
    )

)
Ian avatar Jan 01 '70 08:01 Ian
Aceptado

Aquí hay otra manera. No se guardan variables intermedias.

Usamos esto para eliminar duplicados de resultados de una variedad de consultas superpuestas.

$input = array_map("unserialize", array_unique(array_map("serialize", $input)));
daveilers avatar Jun 03 '2009 18:06 daveilers

Desde 5.2.9 puedes usar array_unique()si usas la SORT_REGULARbandera así:

array_unique($array, SORT_REGULAR);

Esto hace que la función compare elementos para determinar la igualdad como si $a == $bestuvieran en uso, lo cual es perfecto para su caso.

Producción

Array
(
    [0] => Array
        (
            [0] => abc
            [1] => def
        )

    [1] => Array
        (
            [0] => ghi
            [1] => jkl
        )

    [2] => Array
        (
            [0] => mno
            [1] => pql
        )

)

Sin embargo, tenga en cuenta que la documentación dice:

array_unique()no está diseñado para funcionar en matrices multidimensionales.

Ja͢ck avatar Aug 22 '2013 07:08 Ja͢ck

De otra manera. También conservará las claves.

function array_unique_multidimensional($input)
{
    $serialized = array_map('serialize', $input);
    $unique = array_unique($serialized);
    return array_intersect_key($input, $unique);
}
OIS avatar Nov 21 '2008 14:11 OIS

Tuve un problema similar pero encontré una solución que funciona al 100%.

<?php
    function super_unique($array,$key)
    {
       $temp_array = [];
       foreach ($array as &$v) {
           if (!isset($temp_array[$v[$key]]))
           $temp_array[$v[$key]] =& $v;
       }
       $array = array_values($temp_array);
       return $array;

    }


$arr="";
$arr[0]['id']=0;
$arr[0]['titel']="ABC";
$arr[1]['id']=1;
$arr[1]['titel']="DEF";
$arr[2]['id']=2;
$arr[2]['titel']="ABC";
$arr[3]['id']=3;
$arr[3]['titel']="XYZ";

echo "<pre>";
print_r($arr);
echo "unique*********************<br/>";
print_r(super_unique($arr,'titel'));

?>
Rajendrasinh avatar May 09 '2012 10:05 Rajendrasinh