php - 如何在数组中查找并计算相同的值,然后插入包含 : ‘count: (int)’ via PHP? 的节点

标签 php arrays sorting multidimensional-array

我有一个动态的纬度和经度数组,但我需要插入相同值的计数,同时通过 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() 捆绑在一起的循环:

  1. array_map()原始数组的 lat,lng 数组对转换为字符串数组 lat|lng
  2. array_count_values() 计算这些 lat|lng 字符串的唯一值,并将它们作为指向计数值的数组键返回
  3. 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 顺序编号。如果您确实需要保留原始数组键,则需要做更多工作。

Working demonstration

关于php - 如何在数组中查找并计算相同的值,然后插入包含 : ‘count: (int)’ via PHP? 的节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66165832/

相关文章:

PHP skip for loop Iteration 基于一个查询结果集

c# - 对是否使用 fixed with unsafe code 和 stackalloc 的困惑

swift - 如何在 Swift 中按 future 时间对对象进行排序?

java - 使用整数和字符进行数组排序

arrays - 对快速数组进行排序并跟踪原始索引

php - 在执行基本 SELECT 操作时,您的 SQL 语法有错误

php - Doctrine2 - "class"不是有效的实体或映射的父类(super class)

php - CSV换行问题

c++ - 从内存读出和读入整个数组到硬盘驱动器(在 C/C++ 中)

php - 检查数组的每个部分是否为数字