给定一个像这样的数组:
$array = array(
0 => array (
0 => 35,
1 => 30,
2 => 39
),
1 => array (
0 => 20,
1 => 12,
2 => 5
),
...
n => array (
0 => 10,
1 => 15,
2 => 7
),
);
我需要找到数组中与给定参数最接近的条目。
find($a, $b, $c) {
//return the closer entry to the input
}
更靠近输入值的条目,我指的是具有更接近输入值的数值的条目,例如传递(19,13,3),它应返回 $array [1]
我目前进行计算的方式是遍历整个数组,保持一个从-1开始的变量$distance和一个临时的$result变量。对于每个元素,我计算距离。
$dist = abs( subarray[0] - $a ) + abs ( subarray[1] - $b ) + abs( subarray[2] - $c )
如果计算出的距离等于-1或小于循环外的变量$distance,则将新距离分配给该变量,并将相应的数组保存在$result变量中。 循环结束时,我最终得到所需的值。
另外,其中一个值可以为空:例如(19、13、false),仍应返回$array[1],然后计算应忽略缺失的参数 - 在这种情况下,距离被计算为
$dist = abs( subarray[0] - $a ) + abs ( subarray[1] - $b );
忽略subarray [2]和$c的值。
问题是,即使我的代码有效,由于数组的大小可以轻松地增加到数十万个元素,因此执行所需的时间太长。我们仍在谈论毫秒级别,但出于各种原因,这仍然是不可接受的。 有没有更有效的方法来进行搜索以节省一些时间?