PHP 需要一个函数来从对象中获取最接近的数字

问题描述 投票:0回答:5

我有以下代码

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 if-statement closest
5个回答
1
投票

你需要改变循环中的一些东西

<?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);
?>

查看演示:https://eval.in/698262


0
投票
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 ; 
}

0
投票

您的函数返回第一个值。

$closest = NULL;
foreach ($array as $a) {
    if ($a->stappen <= $number) {
        $closest = $a;
    }
    else /* if ($a->stappen > $number) */ {
        return $closest;
    }
}
...

0
投票

请使用这个..

<?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)];
}

?>

0
投票

对于这个问题,排序不是必需的,只会减慢程序的速度。只需跟踪到目前为止最接近的 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/

© www.soinside.com 2019 - 2024. All rights reserved.