我有以下代码
function closestdown($array, $number) {
sort($array);
foreach ($array as $a) {
if ($a->stappen <= $number){
return $a;
}}
return end($array); // or return NULL;
}
我这样称呼它:
$citylist = $manager->getStedenList();
$stappeng = $user->user_stappen;
$lowernumber = closestdown($citylist, $currentcity);
但它没有给我最接近的数字,而是返回遇到的第一个较小的数字。
示例:如果我使用这些数字
$lowernumber = closestdown(1 5 6 99 487 98785, 100);
它返回:1,而它应该返回99。
$citylist 看起来像:
array(4) {
[0]=>
object(Steden)#272 (3) {
["name"]=>
string(10) "Bourguette"
["id"]=>
string(1) "6"
["stappen"]=>
string(2) "13"
}
[1]=>
object(Steden)#268 (3) {
["name"]=>
string(4) "Gent"
["id"]=>
string(1) "4"
["stappen"]=>
string(3) "666"
}
[2]=>
object(Steden)#271 (3) {
["name"]=>
string(16) "garabier(Afrika)"
["id"]=>
string(1) "8"
["stappen"]=>
string(9) "909814037"
}
[3]=>
object(Steden)#297 (3) {
["name"]=>
string(9) "Terneuzen"
["id"]=>
string(1) "7"
["stappen"]=>
string(10) "2147483647"
}
}
我如何获得最接近 $stappeng 的数字(它仅包含 1 个值示例:'100')
提前致谢
你需要改变循环中的一些东西
<?php
function closestdown($array, $number) {
if(count($array)==1){
return $array[0];
}
sort($array);
foreach ($array as $a) {
if ($a > $number){//You can use $a->stappen
if(($a-$number)<($number-$previous))
return $a;
else
return $previous;
}else{
$previous = $a;
}
}
return end($array); // or return NULL;
}
echo $lowernumber = closestdown([1, 5, 6, 99, 487, 98785], 100);
?>
function closestdown($array, $number) {
sort($array);
$closest = 1000000000000;
$return = null;
foreach ($array as $a) {
if (abs($a->stappen - $number) < $closest && $a->stappen <= $number){
$closest = abs($a->stappen - $number);
$return = $a;
}}
return $return ;
}
您的函数返回第一个值。
$closest = NULL;
foreach ($array as $a) {
if ($a->stappen <= $number) {
$closest = $a;
}
else /* if ($a->stappen > $number) */ {
return $closest;
}
}
...
请使用这个..
<?php
$array = array(1,4,5,90,99,102,104);
$number = 100;
echo closestdown($array,$number);
function closestdown($array, $number) {
//sort($array);
$temp = array();
foreach ($array as $a) {
array_push($temp,abs($a-$number));
}
asort($temp);
return $array[key($temp)];
}
?>
对于这个问题,排序不是必需的,只会减慢程序的速度。只需跟踪到目前为止最接近的 2 个数字 - 小于目标的最大数字和大于目标的最小数字:
function closest($array, $number) {
$smaller = -INF;
$larger = INF;
foreach ($array as $a) {
if ($a <= $number) {
$smaller = max($smaller, $a);
}
if ($a >= $number) {
$larger = min($larger, $a);
}
}
return abs($larger - $number) < abs($number - $smaller) ? $larger : $smaller;
}
echo (closest([1,5,6,99,487,98785], 100)); // 99
echo "\n";
echo (closest([1,5,6,99,487,98785], 98)); // 99
如果数组已经排序,您可以通过使用二分搜索来利用它:https://www.geeksforgeeks.org/find-closest-number-array/