【问题标题】:Break is not working properly after return true;return true 后break不能正常工作;
【发布时间】:2015-09-28 15:28:03
【问题描述】:

返回真;没有结束当前的函数循环! 这是非常基本的,但我不明白为什么 break 不起作用!

我试试这段代码:

function findKey($array, $keySearch) {
foreach ($array as $key => $item){
    echo "$key == $keySearch";
    if ("$key" == "$keySearch"){
        echo 'yes, it exists';
        return true;
    }
    else 
    {
        if (is_array($item))
            findKey($item, $keySearch);
    }
}
return false;
}

return true; 永远不会中断,因为它在yes, it exists 被回显后让它离开!

已解决

来自已接受解决方案here 的代码本身是错误的。它已得到纠正。此外,您将在下面找到正确答案。

【问题讨论】:

  • return 将立即结束函数的执行并返回您要返回的任何内容。
  • 这是我用来查看的,但是在这种情况下它不起作用!
  • break 语句永远不会执行。找到返回语句后执行返回。
  • 它打破了当前的foreach,但仍然在else语句中重新发送函数!!
  • 递归怪异......你没有对 findKey() 的递归调用的返回值做任何事情...... if (is_array($item)) return findKey($item, $keySearch); 也许?

标签: php foreach return break


【解决方案1】:

你已经得出了一个结论。事实上,您的return true肯定会立即结束函数(包括跳出循环),但它只会结束函数的当前调用。您的解决方案是递归的,并且在 else 子句中有一个错误,从而完全忽略了对 findKey 的递归调用的结果。因此,该调用内部发生的任何事情都无效。

您在外部函数调用中看到了 echo

我想你真正想写的是这样的:

function findKey($array, $keySearch)
{
   foreach ($array as $key => $item) {
      echo "$key == $keySearch";
      if ($key == $keySearch) {
         echo 'yes, it exists';
         return true;
      }
      else {
         if (is_array($item) && findKey($item, $keySearch))
            return true;
      }
   }

   return false;
}

我对您找到的原始答案进行了相同的更改。

【讨论】:

  • 谢谢。你是对的,但在这种特殊情况下,它会导致问题并影响性能。我测试了这两种解决方案,第一个耗时 0 秒,另一个耗时 +/- 0.001 秒,在我的情况下它不是最好的。你知道如何递归地停止它吗?
猜你喜欢
  • 1970-01-01
  • 2021-05-22
  • 2012-07-31
  • 1970-01-01
  • 1970-01-01
  • 2012-07-12
  • 2022-01-23
  • 1970-01-01
  • 2014-04-19
相关资源
最近更新 更多