Php 如何在数组中查找下一个较大的数字和下一个较小的数字

Php 如何在数组中查找下一个较大的数字和下一个较小的数字,php,algorithm,sorting,Php,Algorithm,Sorting,最初,我有一个值,比如说100 然后,我还有一个数组,其中包含的元素有[99101102103989597] 我想要的是,我想要一个新数组有一个最接近值100 即101&99,然后下一个最接近的值是102&98,依此类推 最后的数组应该是这样的[99101981029710395] 那么在php中如何解决这个问题呢 这个问题有什么具体的算法吗 您可以使用,以便按正在定义的函数对数组进行排序。正如@Pedro Pinheiro在评论中提到的,您可以计算分数,表示元素与100的距离,这正是usort

最初,我有一个值,比如说
100

然后,我还有一个数组,其中包含的元素有
[99101102103989597]

我想要的是,我想要一个新数组有一个最接近值
100
101
&
99
,然后下一个最接近的值是
102
&
98
,依此类推

最后的数组应该是这样的
[99101981029710395]

那么在php中如何解决这个问题呢

这个问题有什么具体的算法吗

您可以使用,以便按正在定义的函数对数组进行排序。正如@Pedro Pinheiro在评论中提到的,您可以计算分数,表示元素与100的距离,这正是usort得到的

因此,您的代码可以是:


您可以简单地收集关联数组中的数字,其中键与100的差值为。稍后,您可以根据差异对它们进行排序。这样,在许多普通情况下,您的排序成本将是最小的

<?php

$a = array(99, 95, 101, 102, 103, 98, 97, 110);

$number = 100;
$diff = [];

foreach($a as $ele){
    $diff[abs($number - $ele)][] = $ele;
}

ksort($diff,SORT_NUMERIC);
print_r($diff);

您可以遍历
[99、101、102、103、98、95、97]
的所有元素,并计算一种分数:
abs(100数组[i])
。这个分数表示元素离数字100有多远。然后,您将根据该分数对原始数组进行排序。如果有
10000
记录怎么办?以及较小的数字怎么办。因为
99
101
都在同一位置。这也起作用了!!!但我无法在usort中传递变量。你可能知道100是可变的。你能告诉我上述代码的效率吗?例如,假设一个数组中有1000多个元素,它能工作多远?@DanishTahir此代码的时间复杂度为
k log(k)+O(n)
,其中
k
是唯一差异的数量,
n
是数组的长度。在大小为1000的阵列上,它应该是快速的。