【问题标题】:Is it possible to run multiple elseif blocks in the same if block?是否可以在同一个 if 块中运行多个 elseif 块?
【发布时间】:2012-05-28 08:51:57
【问题描述】:
$foo=1;

function someFunction(){
  if($foo==0){ //-------Will test, won't execute
    bar();
  }elseif($foo==1){ //--Will test, and execute
    baz();
  }elseif($foo==2){ //--Doesn't test
    qux();
  }elseif($foo==3){ //--Doesn't test
    quux();
  }else{ //-------------Doesn't test
    death();
  } //------------------The program will skip down to here.
}

假设 baz() 改变了 $foo 的值,并且每次都不同。我希望我的代码在第一个语句之后继续测试 elseif/else 语句,并在它们为真时运行它们。

我不想再次运行整个函数(即我不在乎 $foo = 0 还是 1)。我正在寻找类似“继续;”的东西。无论如何,请让我知道这是否可能。谢谢。 :)

编辑** 我的代码实际上比这要复杂得多。我只是为了理论而写下一些代码。我想要的只是脚本在通常不会的地方继续测试。

【问题讨论】:

  • 你没有声明 foo 全局,所以 php 会报错
  • 看起来像是 switch\case 的工作
  • 也许这应该在 WHILE 循环中完成?
  • 使用返回; ?我在 php 上不是 hax,所以我不知道 emypy 返回是否会起作用,但你可以尝试
  • 我认为这是您的功能逻辑而不是代码的问题。听起来好像您的代码和您需要的逻辑不匹配。您需要首先确定逻辑应该如何工作,因为如果 while 循环、switch 和 elseifs 不起作用,我看不到您还剩下什么选项。

标签: php if-statement


【解决方案1】:

如果我的理解正确,您希望执行每个连续的elseif,无论之前的if/elseifs 是否匹配,但如果没有,您还希望运行一些代码> if/elseifs 匹配。在这种情况下,如果其中一个匹配,您可以将标志 $matched 设置为 true,并改用 ifs。

<?php
$foo=1;
function someFunction(){
  $matched = false;
  if($foo==0){
    bar();
    $matched = true;
  }
  if($foo==1){ //--This elseif will get executed, and after it's executed,
    baz();
    $matched = true;
  }
  if($foo==2){
    qux();
    $matched = true;
  }
  if($foo==3){
    quux();
    $matched = true;
  }
  if(!$matched){ /* Only run if nothing matched */
    death();
  }
}

如果您还希望能够跳到最后,请使用goto(但see this first):

<?php
$foo=1;
function someFunction(){
  $matched = false;
  if($foo==0){
    bar();
    $matched = true;
    goto end: // Skip to end
  }
  if($foo==1){ //--This elseif will get executed, and after it's executed,
    baz();
    $matched = true;
  }
  if($foo==2){
    qux();
    $matched = true;
  }
  if($foo==3){
    quux();
    $matched = true;
  }
  if(!$matched){ /* Only run if nothing matched */
    death();
  }
  end:
}

【讨论】:

  • 看来 OP 要求它工作,就好像“someFunction”有一个循环在每个“elseif”之后检查 $foo 的值,直到它不再等于 1、2、或 3 在执行 elseif 代码中的函数之后。但是 OP 不能使用循环、开关或 elseifs........
  • 是的。这个答案会奏效。 :) 但是为了学习,我仍然很想知道是否有任何方法可以让我的脚本继续并检查其他 elseif/else 语句?
  • @Aust, no: "elseif 语句仅在前面的 if 表达式和任何前面的 elseif 表达式评估为 FALSE 并且当前 elseif 表达式评估时执行到TRUE。” elseif 的全部意义在于执行未来的elseif 表达式。但是,它可能...使用goto...但是不要这样做
  • 嗯,好的。感谢您的帮助!
  • @Aust 我必须同意 bfrohs - 无论您需要什么功能(我认为您让我们都对您需要什么感到困惑!)不要使用 goto。这是不好的做法 - 如果您认为您的代码现在很复杂,请等到您尝试追踪 goto 在未知方向发送执行时出错的地方!
【解决方案2】:

我不知道这是否是你的意思,但你可以使用 switch 语句:

$foo=1;
function someFunction(){
  switch($foo==0){
    case 0:
        bar();
    case 1:
        baz();
    case 2:
        qux();
    case 3:
        quux();
    default:
        death();
}

请注意,每个案例都不会中断。

【讨论】:

  • 抱歉,我不知道如何解释,但我的代码非常复杂,因此在这种情况下,while 循环、switch\case 和多个 if 将不起作用。实际上,除了 $foo 之外,还有更多的检查。我只是想知道我是否可以继续我的 if 块?
  • 那么您需要更改您的问题以提供更多信息,以便我们为您提供帮助。
【解决方案3】:

你不能只使用 else if 而只是一堆 ifs...

【讨论】:

    【解决方案4】:

    // 此响应不正确。请参见下面的 cmets。谢谢!

    我不是专家,但按照我的理解,它们会继续运行。如果将来您正在编写一组elseif() 语句并且您想在其中一个为真时离开该系列,您可以使用break 命令。另见switch()

    如果我错了,我绝对愿意纠正。

    【讨论】:

    • 不,你错了。 if(1==1){/*a*/}elseif(2==2){/*b*/} 等价于if(1==1){/*a*/}else{if(2==2){/*b*/}}/*b*/ 每次都会被跳过)。
    • 谢谢@bfrohs。我很感激这种更正。你在页面顶部的解释是完美的。
    猜你喜欢
    • 2015-04-02
    • 2020-08-02
    • 2018-07-24
    • 1970-01-01
    • 2020-05-30
    • 1970-01-01
    • 2019-11-17
    • 1970-01-01
    • 2013-05-16
    相关资源
    最近更新 更多