实际场景中,这种需求应该不多。恰好我遇到了这种需求,分享给大家,仅供参考!
<?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编辑
,原因: