实际场景中,这种需求应该不多。恰好我遇到了这种需求,分享给大家,仅供参考!
<?php
/**
 * 获取某数字在 升序数字数组 中的位置
 * @param array $nums 数字数组
 * @param int $num 数字
 * @return array key 和 value 在第0位置之前时则返回['key'=>-1,'value'=>0]
 */
function searchIndex(array $nums, int $num): array
{
    $tmp_nums = $nums;
    $tmp_nums[] = $num;
    $tmp_nums = array_unique($tmp_nums);
    sort($tmp_nums);
    $key = array_search($num, $tmp_nums);
    return [
        'key' => (isset($nums[$key]) && $nums[$key] == $num) ? $key : $key - 1,
        'value' => (isset($nums[$key]) && $nums[$key] == $num) ? $num : ($nums[$key - 1] ?? 0),
    ];
}
/** @var array $rateArr 用这个数字数组进行测试 */
$rateArr = explode('|', '0|100|200|300|400|600|900|2500|5000|80000');
print_r($rateArr);
print_r(searchIndex($rateArr, -2));
print_r(searchIndex($rateArr, 0));
print_r(searchIndex($rateArr, 400));
print_r(searchIndex($rateArr, 500));
print_r(searchIndex($rateArr, 600));
print_r(searchIndex($rateArr, 600000));
?>
/**************************输出结果如下***************************************/
Array
(
    [0] => 0
    [1] => 100
    [2] => 200
    [3] => 300
    [4] => 400
    [5] => 600
    [6] => 900
    [7] => 2500
    [8] => 5000
    [9] => 80000
)
Array
(
    [key] => -1
    [value] => 0
)
Array
(
    [key] => 0
    [value] => 0
)
Array
(
    [key] => 4
    [value] => 400
)
Array
(
    [key] => 4
    [value] => 400
)
Array
(
    [key] => 5
    [value] => 600
)
Array
(
    [key] => 9
    [value] => 80000
)
优化后的版本,理论上效率更高
<?php 
   /**
     * 获取某数字在 升序数字数组 中的位置
     * @param array $nums 升序数字数组,如[0,100,200,300]
     * @param int $num 数字
     * @return array key 和 value 在第0位置之前时则返回['key'=>-1,'value'=>0]
     */
    public function searchIndex(array $nums, int $num): array
    {
        $key = array_search($num, $nums);
        if ($key !== false) return ['key' => $key,'value' => $num,];
        $index = count($nums) - 1;
        while ($index >= 0 && $nums[$index] > $num) {
            $index--;
        }
        return ['key' => $index,'value' => ($index >= 0) ? $nums[$index] : 0,];
    }
					
		
		最后于  2023-11-10		
				被admin编辑
				
		,原因: