php实现某数字在一个顺序排列的数字数组中的位置

admin 2023-07-26 15:07:51 2009

实际场景中,这种需求应该不多。恰好我遇到了这种需求,分享给大家,仅供参考!

<?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编辑 ,原因:
可爱猫?Telegram电报群 https://t.me/ikeaimao

社区声明 1、本站提供的一切软件、教程和内容信息仅限用于学习和研究目的
2、本站资源为用户分享,如有侵权请邮件与我们联系处理敬请谅解!
3、本站信息来自网络,版权争议与本站无关。您必须在下载后的24小时之内,从您的电脑或手机中彻底删除上述内容
最新回复 (0)

您可以在 登录 or 注册 后,对此帖发表评论!

返回