在Php数组中比较值的位置

3
$commands = array();

    for($p = 0; $p < $commandCount ; $p++){
          $commands[$p] = $_POST['select'.$p];
    }

我有一个名为$commands的数组,在这个数组中存储了一系列命令。我需要检查“mark”命令存储在哪个位置,并且如果某个特定命令在它后面,就需要执行一些操作。

以下是可能出现在$commands数组中的一些示例数据:

"mark", "ignore", "pick", "random"

您会如何处理?


你能提供存储在$commands中的样本数据吗? - Shahnawaz Kadari
"标记", "忽略", "选择", "随机" - Sebastian L.
3个回答

1
您可以使用$index = array_search("mark", $commands),它将返回命令“mark”的第一个出现的索引,然后您可以使用$commands[$index + 1]来获取数组中的下一个命令。
您还需要检查$index != null,否则它可能会返回您的$commands数组中的第一项,因为null被解释为0。

如果我的数组看起来像这样会发生什么?$command = array("mark","ignore","mark"? - Sebastian L.
它将返回第一个“mark”元素的位置,下一个将是“ignore”。 - DobromirM

1
这里有一个测试案例电池演示,完全展示了它的工作原理并识别了边缘情况:(演示链接)
*注意,当没有找到针头时,array_search()返回false
$commands = array("mark", "ignore", "pick", "random");

$attempts = array("mark", "ignore", "pick", "random", "bonk");
foreach($attempts as $attempt){
    echo "$attempt => ";
    $index=array_search($attempt,$commands);
    //                                    vv---increment the value
    if($index===false || !isset($commands[++$index])){  // not found or found last element
        $index=0;                                      // use first element
    }
    echo $commands[$index],"\n";
}

“或”(||)条件会进行“短路”,所以如果$indexfalse,它将在不调用第二个表达式(isset())的情况下退出条件。
输出:
mark => ignore
ignore => pick
pick => random
random => mark
bonk => mark

@mcv 这是我演示如何做的示例...假设 OP 在针未找到或针为最后一个元素时希望默认使用第一个值。 - mickmackusa
我已经测试过了!这个答案实际上是最好的。感谢您所有的输入。但是,如果找不到针头,我可能会使用“值标记DNE”的选择。 - mcv
是的,DNE 可能是首选的输出。只有 OP 能决定什么对他们的应用程序是正确的。 - mickmackusa
不幸的是,我的系统有点敏感。但我设法解决了它。现在我希望我能考虑所有机会。 - Sebastian L.
@mickmackusa 对不起,我回复晚了,我一直很忙。我用array_search()成功地管理了我的逻辑,我添加了一个switch语句并使其工作 :) - Sebastian L.

-1

刚刚进行了一些双重检查,您首先需要断言数组包含mark的值。否则,array_search将返回false,并且很容易被转换为0。

支持文档:

PHP in_array

PHP array_search

$commands = array("mark", "ignore", "pick", "random");
//checks if $command contains mark, 
//gets first index as per documentation 
//Or sets index to -1, ie No such value exists.
 $index = in_array("mark",$commands) ? array_search("mark",$commands):-1;
//gets the next command if it exists
 $nextCommand = $index!=-1? $commands[++$index]:"Unable to Find Command: mark";

1
执行 in_array() 然后执行 array_search() 不是好的编程实践。 - mickmackusa
为什么不呢?你需要考虑一下如果标记不在命令列表中的情况,或者如果 $commands = array("ignore", "pick", "random");,那么你将返回 pick 的值,这会使得上面的所有答案都是错误的。 - mcv
array_search()可以完成所有必要的工作。in_array()是多余的数组组合。(不是我的投票) - mickmackusa
1
说实话,我不喜欢答案中提到“null”,因为检查“false”更准确。我喜欢你的心态。如果你是一个“学习者”,你永远不会是一个“失败者”。自从加入这个社区以来,我已经成为了很多次“学习者”。 - mickmackusa
1
这是一个“宽松比较”,当可能存在“falsey/zero-ish”值时,执行“严格比较”非常重要,如下所示:===!== - mickmackusa
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接