Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 我有x,y坐标池,我需要匹配给定x,y的最近匹配_Php_Algorithm_Sorting_Coordinates_Coordinate Systems - Fatal编程技术网

Php 我有x,y坐标池,我需要匹配给定x,y的最近匹配

Php 我有x,y坐标池,我需要匹配给定x,y的最近匹配,php,algorithm,sorting,coordinates,coordinate-systems,Php,Algorithm,Sorting,Coordinates,Coordinate Systems,范例 我必须匹配x,y,不是x和y的和,而是x和y中最接近的。 不是最接近的x+y或x1-x+y1-y都是错误的,我需要完美匹配 8.912680,45.629392 1 8.919280,45.622651 2 8.910296,45.626021 3 8.914084,45.627028 4 8.913913,45.62941 也许这会帮助你走上正轨: $pair_coordinates = array(array(10.919280,45.622651),

范例

我必须匹配x,y,不是x和y的和,而是x和y中最接近的。 不是最接近的x+y或x1-x+y1-y都是错误的,我需要完美匹配

8.912680,45.629392

1   8.919280,45.622651  
2   8.910296,45.626021  
3   8.914084,45.627028  
4   8.913913,45.62941  

也许这会帮助你走上正轨:

$pair_coordinates = array(array(10.919280,45.622651),array(8.910296,45.626021),array(8.914084,45.627028), array(8.913913,45.62941 ));

$i = 0;

    $x = 8.919380;
    $y = 45.623651;

foreach($pair_coordinates as $pair_coordinate)
{


    $lng = $pair_coordinate[0] - $x;
    $lon = $pair_coordinate[1] - $y;        

    $data[$i] = sqrt(pow($lng,2) + pow($lon,2));

    $i++;
}

$m = array_search(min($data), $data);

print_r($pair_coordinates[$m]);
使用array_reduce的另一个解决方案:


我们总是乐于帮助和支持新的编码人员,但您首先需要帮助自己:如果您有问题,请发布您尝试过的内容,并清楚解释哪些内容不起作用,然后提供。读一个好问题。请务必阅读。就像一对值需要与一对值的数组匹配一样。您是否试图求解斜边?是的,我的问题很难回答,过去9年来我一直在编码,对于简单的编码器和简单的解决方案制定者来说,这很难理解。循环槽并计算每个值的平方根AbsX1-X2^2+absY1-Y2^2,最小的将是最接近的
$pair_coordinates = array(array(10.919280,45.622651),array(8.910296,45.626021),array(8.914084,45.627028), array(8.913913,45.62941 ));

$i = 0;

    $x = 8.919380;
    $y = 45.623651;

foreach($pair_coordinates as $pair_coordinate)
{


    $lng = $pair_coordinate[0] - $x;
    $lon = $pair_coordinate[1] - $y;        

    $data[$i] = sqrt(pow($lng,2) + pow($lon,2));

    $i++;
}

$m = array_search(min($data), $data);

print_r($pair_coordinates[$m]);
<?php

$coords = array(
    array("lng" => 8.919280, "lat" => 45.622651),
    array("lng" => 8.910296, "lat" => 45.626021),
    array("lng" => 8.914084, "lat" => 45.627028),
    array("lng" => 8.913913, "lat" => 45.62941)
);

$find = array("lng" => 8.912680, "lat" => 45.629392);

$idx = null;
$shortest = null;

foreach($coords as $k => $v)
{
    // I know the abs() calls are optional, but this allows for some other logic to be used on the individual distances aswell.
    $dLng = abs($find["lng"] - $v["lng"]); 
    $dLat = abs($find["lat"] - $v["lat"]);

    $distance = sqrt($dLng * $dLng + $dLat * $dLat);

    if (!$shortest || $distance < $shortest)
    {
        $shortest = $distance;
        $idx = $k;
    }
}

if ($idx)
{
    echo "Found:\n";
    print_r($coords[$idx]);
} else {
    echo "Nothing found.";
}
Found:
Array
(
    [lng] => 8.913913
    [lat] => 45.62941
)
<?php

$coords = array(
    array("lng" => 8.919280, "lat" => 45.622651),
    array("lng" => 8.910296, "lat" => 45.626021),
    array("lng" => 8.914084, "lat" => 45.627028),
    array("lng" => 8.913913, "lat" => 45.62941)
);

$find = array("lng" => 8.912680, "lat" => 45.629392);

function distance($a, $b)
{
    $dLng = abs($a["lng"] - $b["lng"]);
    $dLat = abs($a["lat"] - $b["lat"]);

    $distance = sqrt($dLng * $dLng + $dLat * $dLat);

    return $distance;
}


$nearest = array_reduce($coords, function($carry, $item) use ($find)
{
    if (!$carry)
        return $item;

    $dCarry = distance($find, $carry);
    $dItem = distance($find, $item);

    return $dCarry < $dItem ? $carry : $item;
}, null);

print_r($nearest);
Array
(
    [lng] => 8.913913
    [lat] => 45.62941
)