如何正确制作像这样的阵列是唯一的? (并且我的意思是只删除了数组[3],因为它是数组[2]的副本)
array(
array( "Title", 50, 96 ),
array( "Other Title", 110, 225 ),
array( "Title", 110, 225 ),
array( "Title", 110, 225 ),
)
在这种情况下,我想要过滤掉的唯一数组是最后一个(在这种情况下),但是没有特定的顺序,并且手工劳动不会削减它。 (弹出目标位置)。这是一个相当大的阵列,我也要在这里考虑性能。
我还可以安排数据如下:
array(
array( "Title" => array( 50, 96 ), array(110, 225) )
array( "Other Title", array( 110, 225 ) )
)
但这次对我的原因没有帮助。
数组中没有唯一值(单独),但每个二级数组的值组合是唯一的。
答案 0 :(得分:4)
试试这个......
$input = array_map("unserialize", array_unique(array_map("serialize", $input)));
答案 1 :(得分:2)
当然有人会用更好的解决方案来打败我,但这很简单。您所做的就是通过连接所有元素来“散列”原始数组,然后跟踪哪些元素已添加到该组唯一输入中。如果原始数组的'hashed'(连接值)尚未添加到哈希数组中,则只添加原始数组。
$aMain = array(
array( "Title", 50, 96 ),
array( "Other Title", 110, 225 ),
array( "Title", 110, 225 ),
array( "Title", 110, 225 ),
);
$_aHashed = array();
$aUniqued = array();
foreach($aMain as $aUnhashed) {
$sHash = implode('', $aUnhashed);
if(!in_array($sHash, $_aHashed)) {
$_aHashed[] = $sHash;
$aUniqued[] = $aUnhashed;
}
}
var_dump($aUniqued);
答案 2 :(得分:1)
$filtered = array();
foreach ($array as $entry) {
$hash = md5(serialize($entry));
$filtered[$hash] = $entry;
}
您甚至可以放弃md5
以加快流程。
答案 3 :(得分:1)
$array = array(array("Title", 50, 96), array("Other Title", 110, 225), array("Title", 110, 225), array("Title", 110, 225));
function remove_duplicates_multi_array($array) {
$serialized_arrays = array();
// serialize every array
foreach ($array as $key=>$value) {
$serialized_arrays[$key] = serialize($value);
}
// use array_unique to remove duplicates
$unique_array = array_unique($serialized_arrays);
$multi_unique = array();
//unserialize every item inside the array
foreach($unique_array as $key=>$value) {
$multi_unique[$key] = unserialize($value);
}
return $multi_unique;
}
var_dump(remove_duplicates_multi_array($array));