Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 按键按相反顺序排列的最近数组元素_Php_Arrays - Fatal编程技术网

Php 按键按相反顺序排列的最近数组元素

Php 按键按相反顺序排列的最近数组元素,php,arrays,Php,Arrays,我有自定义代码,通过数组键从数组中获取最近的用户: $users = [ "4" => "John", "7" => "Alex", "13" => "Smith", "95" => "Taylor" ]; $id = 9; $nearestUserByIdInReverseOr

我有自定义代码,通过数组键从数组中获取最近的用户:

$users = [
    "4" => "John",
    "7" => "Alex",
    "13" => "Smith",
    "95" => "Taylor"
];

$id = 9;

$nearestUserByIdInReverseOrder = false;

foreach($users as $userId => $name) {
    if($id >= $userId) {
        $nearestUserByIdInReverseOrder = $name;
    }
}

echo $nearestUserByIdInReverseOrder;
当我将var
$id
更改为3或更小的数字时,不会得到结果。当
$id
小于它时,如何获取数组的第一个元素。如果我的代码中有不正确的逻辑操作,可以缩短或优化代码?也许这在没有循环的情况下是可能的

这里是

您可以在数组上使用array_keys()(props to),在该数组中搜索最接近的数字(),然后根据该数字获取名称


这是可行的,逻辑非常简单,尽管可能有更好的解决方案。我肯定有人会在某个时候使用它来做一些事情:)

如果您想获取数组中的第一个值,如果
$id
小于任何数组键,您可以使用以下命令将
$nearestuserbyidinverseOrder初始化为数组中的第一个元素:

输出:

John

请注意,要使此(或原始代码)正常工作,键的数字顺序必须递增。如果它们可能不存在,则首先使用数组:

ksort($users);
ksort($users);

根据您的解释,您希望反转比较逻辑。此外,当您找到更大的密钥时,您希望将
从循环中断开,否则您将始终获得最大的数字:

foreach($users as $userId => $name) {
    if($userId > $id) {
        $nearestUserByIdInReverseOrder = $name;
        break;
    }
}
我已经删除了
=
,因为它将为
$id=4
返回
4
,而不是
7
。如果这不是期望的行为,则将其添加回

如果不能保证数组按键的升序排列,则需要首先排序:


你能详细说明一下“最近的”在你的案例中是什么意思,并举几个例子吗?e、 g.
$id
的值为12或14将产生
Smith
?如果您的
$id
在2个
$users
之间相等,您会期望什么?例如,假设您有用户
20
22
$id
21
?当当前id 12等于
Alex
时,当14
Smith
时,则结果等于
。您可以看到我的演示因问题不明确而被否决(特别是因为在您的期望中没有提到“顺序”)。但是,先生,如果您输入
94
作为示例,最接近
94
的是
95
,这将返回
Smith
,而不是
Taylor
,不是吗?@OMiShah OP希望在
$id
值下面找到最接近的名称。查看他们的演示代码,以及他们对
$id=12
$id=14
时返回的值的注释,然后就可以了。我要求清除我的一般查询,不介意:)@OMiShah一点问题都没有。这个答案还导致
Alex
对于
$id=12
,当id 14结果必须是
Smith
而不是
Taylor
作为您的代码结果时。然后,您的问题不清楚当$id小于它时,如何获取数组的第一个元素。14不小于13。人们通常从错误中学习。如果你看到我的错误,请纠正我。错误是问题不清楚你想要什么。如果
$id=12
怎么办?您仍然想要
Smith
还是想要
Alex
。12时的结果必须是
Alex
。为什么您不查看我的演示代码并尝试任何数字并查看结果?如果您通过$id=12并运行代码,它将返回
Alex
,而不是
Smith
@OMiShah(来自OP):“当当前id 12时,结果等于
Alex
,当14
Smith
”@OMiShah这没关系,因为12之前的最大指数是7,13大于12,所以它不应该返回这个值。这就是排序列表中“顺序”的基本含义。
ksort($users);
function findClosest($array, $index) {
    ksort($array);
    $idx = array_keys($array)[0];
    foreach ($array as $key => $value) {
        if ($key > $index) return $array[$idx];
        $idx = $key;
    }
}

$users = [
    "13" => "Smith",
    "4" => "John",
    "7" => "Alex",
    "95" => "Taylor"
];

$id = 3;

echo findClosest($users, $id);