我有一个动态的纬度和经度数组,但我需要插入相同值的计数,同时通过 PHP 消除重复项。所以这...
Array (
[0] => Array (
[lat] => 40.7587979
[lon] => -73.9623427
)
[1] => Array (
[lat] => 39.8587028
[lon] => -84.277025
)
[2] => Array (
[lat] => 37.7647993
[lon] => -122.4629897
)
[3] => Array (
[lat] => 37.7647993
[lon] => -122.4629897
)
[4] => Array (
[lat] => 33.5125302
[lon] => -117.6860507
)
[5] => Array (
[lat] => 39.8587028
[lon] => -84.277025
)
)
...变成这样...
Array (
[0] => Array (
[lat] => 40.7587979
[lon] => -73.9623427
[count] => 1
)
[1] => Array (
[lat] => 39.8587028
[lon] => -84.277025
[count] => 2
)
[2] => Array (
[lat] => 37.7647993
[lon] => -122.4629897
[count] => 2
)
[3] => Array (
[lat] => 33.5125302
[lon] => -117.6860507
[count] => 1
)
)
我理解使用 array_count_values(),但这不会在每个节点中插入新的计数值。用例是热图,其中 map 根据相同坐标的数量进行加权。
最佳答案
有几种方法可以解决这个问题,涉及循环和条件,但 array_count_values()
对于大型集合非常有效。下面是一个将 array_count_values()
与 array_map()
捆绑在一起的循环:
array_map()
将原始数组的lat,lng
数组对转换为字符串数组lat|lng
array_count_values()
计算这些lat|lng
字符串的唯一值,并将它们作为指向计数值的数组键返回foreach
循环迭代lat|lng
键控计数数组,并将它们拆分回输出子数组。
// To hold the new array
$out = [];
// Outer loop over the result from array_count_values()
foreach (array_count_values(array_map(function($l) {
// Map function combines lat|lng
return implode("|", $l);
// The rest of the loop syntax...
}, $original_array)) as $pair => $count) {
// Split the counted array key back to individual lat,lng
list($lat, $lng) = explode("|", $pair);
// Put it all onto the output array
$out[] = [
'lat' => $lat,
'lng' => $lng,
'count' => $count
];
}
print_r($out);
打印:
Array
(
[0] => Array
(
[lat] => 40.7587979
[lng] => -73.9623427
[count] => 1
)
[1] => Array
(
[lat] => 39.8587028
[lng] => -84.277025
[count] => 2
)
[2] => Array
(
[lat] => 37.7647993
[lng] => -122.4629897
[count] => 2
)
[3] => Array
(
[lat] => 33.5125302
[lng] => -117.6860507
[count] => 1
)
)
注意:与示例输出的一个区别是,您在丢弃重复项 0,1,2,4
后保留了原始外部数组键。此输出是一个新数组,对所有外部键按 0,1,2,3
顺序编号。如果您确实需要保留原始数组键,则需要做更多工作。
关于php - 如何在数组中查找并计算相同的值,然后插入包含 : ‘count: (int)’ via PHP? 的节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66165832/