在PHP中删除关联数组的重复元素

kn3*_*n3l 31 php arrays multidimensional-array

$result = array(
    0=>array('a'=>1,'b'=>'Hello'),
    1=>array('a'=>1,'b'=>'other'),
    2=>array('a'=>1,'b'=>'other'),
);
Run Code Online (Sandbox Code Playgroud)

如果重复删除它,结果如下:

$result = array(
    0=>array('a'=>1,'b'=>'Hello'),
    1=>array('a'=>1,'b'=>'other')   
);
Run Code Online (Sandbox Code Playgroud)

有谁知道这样做?

谢谢

hak*_*kre 57

无论其他人在这里提供什么,您正在寻找一个名为array_uniqueDocs的功能.这里重要的是将第二个参数设置为SORT_REGULAR,然后工作很简单:

array_unique($result, SORT_REGULAR);
Run Code Online (Sandbox Code Playgroud)

SORT_REGULAR国旗的意思是:

正常比较项目(不要更改类型)

这就是你想要的.您想在此处比较数组文档,并且不要将其类型更改为字符串(如果未设置参数,则默认为默认值).

array_unique做一个严格的比较(===在PHP中),对于数组这意味着:

$a === $b TRUE 如果$ a和$ b具有相同顺序和相同类型的相同键/值对.

输出(演示):

Array
(
    [0] => Array
        (
            [a] => 1
            [b] => Hello
        )

    [1] => Array
        (
            [a] => 1
            [b] => other
        )
)
Run Code Online (Sandbox Code Playgroud)


Dav*_*ler 20

首先,你不能使用plain array_unique来解决这个问题,因为array_unique在内部将数组项视为字符串,这就是为什么在使用array_unique时会出现"无法将数组转换为字符串"的注意事项.

试试这个:

$result = array(
    0=>array('a'=>1,'b'=>'Hello'),
    1=>array('a'=>1,'b'=>'other'),
    2=>array('a'=>1,'b'=>'other')
);

$unique = array_map("unserialize", array_unique(array_map("serialize", $result)));

print_r($unique);
Run Code Online (Sandbox Code Playgroud)

结果:

Array
(
    [0] => Array
        (
            [a] => 1
            [b] => Hello
        )

    [1] => Array
        (
            [a] => 1
            [b] => other
        )

)
Run Code Online (Sandbox Code Playgroud)

序列化对于这些问题非常方便.

如果您觉得这对您来说太神奇了,请查看此博文

function array_multi_unique($multiArray){

  $uniqueArray = array();

  foreach($multiArray as $subArray){

    if(!in_array($subArray, $uniqueArray)){
      $uniqueArray[] = $subArray;
    }
  }
  return $uniqueArray;
}

$unique = array_multi_unique($result);

print_r($unique);
Run Code Online (Sandbox Code Playgroud)

具有讽刺意味的是,in_array正在为阵列工作,而array_unique不是.

  • 好吧,实际上`array_unique`很好.请参阅我的回答:http://stackoverflow.com/a/13860140/367456 (3认同)