$result = array(
0=>array('a'=>1,'b'=>'Hello'),
1=>array('a'=>1,'b'=>'other'),
2=>array('a'=>1,'b'=>'other'),
);
如果重复删除它,结果如下:
$result = array(
0=>array('a'=>1,'b'=>'Hello'),
1=>array('a'=>1,'b'=>'other')
);
有人知道这样做吗?
由于
答案 0 :(得分:50)
无论其他人在这里提供什么,您正在寻找一个名为array_unique
Docs的功能。这里重要的是将第二个参数设置为SORT_REGULAR
,然后工作很简单:
array_unique($result, SORT_REGULAR);
SORT_REGULAR
标志的含义是:
正常比较项目(不要更改类型)
这就是你想要的。你想在这里compare arraysDocs并且不要将它们的类型改为字符串(如果未设置参数,这将是默认值)。
array_unique
进行了严格的比较(PHP中为===
),对于数组,这意味着:
$a === $b
TRUE
如果$ a和$ b具有相同顺序和相同类型的相同键/值对。
输出(Demo):
Array
(
[0] => Array
(
[a] => 1
[b] => Hello
)
[1] => Array
(
[a] => 1
[b] => other
)
)
答案 1 :(得分:20)
首先,你不能使用普通array_unique
来解决这个问题,因为array_unique在内部将数组项视为字符串,这就是为什么在使用array_unique时会出现“无法将数组转换为字符串”的注意事项。 / p>
所以试试这个:
$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);
<强>结果:强>
Array
(
[0] => Array
(
[a] => 1
[b] => Hello
)
[1] => Array
(
[a] => 1
[b] => other
)
)
序列化对于此类问题非常方便。
如果您认为太多魔法,请查看此blog post
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);
具有讽刺意味的是,in_array
适用于数组,其中array_unique
没有。