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
时,当14Smith
时,则结果等于。您可以看到我的演示因问题不明确而被否决(特别是因为在您的期望中没有提到“顺序”)。但是,先生,如果您输入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
,当14Smith
”@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);