首页 > 解决方案 > 如何在数组中查找和计算相同的值,然后通过 PHP 插入一个节点:'count: (int)'?

问题描述

我有一个动态的纬度和经度数组,但我需要插入相同值的计数,同时通过 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(),但这不会在每个节点中插入新的计数值。用例将是一个热图,其中地图根据相同坐标的数量进行加权。

标签: phparrayssortingmultidimensional-array

解决方案


有几种方法可以解决这个问题,涉及循环和条件,但array_count_values()对于大型集合非常有效。这是一个与 to 捆绑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。如果您确实需要保留原始数组键,则需要做更多工作。

工作演示


推荐阅读