首先,这不是重复的问题,因为我已经尝试了大多数堆栈答案。
我的数组中大约有138886
条记录。
记录就像
[1] => Array
(
[country] => US
[state] => Albama
[city] => Brest
[postcode] => 225001-225003
[shipping_info] => Delivery Available
[is_zip_range] => 1
[zip_from] => 225001
[zip_to] => 225003
)
[2] => Array
(
[country] => BY
[state] => Brest
[city] => Brest
[postcode] => 225001-225003
[shipping_info] => Delivery Available
[is_zip_range] => 1
[zip_from] => 225001
[zip_to] => 225003
)
我想从我尝试过某些方法的postcode
值中唯一地记录所有记录
方法1
$temp = array_unique(array_column($data, 'postcode'));
$filteredData = array_intersect_key($data, $temp);
但它仍在提供重复值。
方法2
$filteredData = array_map("unserialize", array_unique(array_map("serialize", $data)));
这是行不通的
方法3
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;
}
$details = unique_multidim_array($array,'postcode');
它正在工作,但是太慢了,大约需要2/3分钟。
让我知道我可以用于唯一数组的任何其他方法。 会得到帮助的
答案 0 :(得分:1)
为什么要这么难,
$in = array (
1 =>
array (
'country' => 'US',
'state' => 'Albama',
'city' => 'Brest',
'postcode' => '225001-225003',
'shipping_info' => 'DeliveryAvailable',
'is_zip_range' => 1,
'zip_from' => 225001,
'zip_to' => 225003
),
2 =>
array (
'country' => 'BY',
'state' => 'Brest',
'city' => 'Brest',
'postcode' => '225001-225003',
'shipping_info' => 'DeliveryAvailable',
'is_zip_range' => 1,
'zip_from' => 225001,
'zip_to' => 225003
)
);
$out = [];
foreach($in as $i) if(!isset($out[$i['postcode']])) $out[$i['postcode']] = $i;
您可以使用in_array进行相同的操作,但是isset更快。
实际上,您甚至不需要进行isset
foreach($in as $i) $out[$i['postcode']] = $i;
数组键始终是唯一的,但这将保留最后一个重复项,因为前面的代码保留了第一个重复项。
如果您遇到按键错误,只需执行$out = array_values($out)
即可将其重置。