Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/272.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
在PHP5.4失去接收变量的能力后,如何使用break?_Php_Foreach_Break - Fatal编程技术网

在PHP5.4失去接收变量的能力后,如何使用break?

在PHP5.4失去接收变量的能力后,如何使用break?,php,foreach,break,Php,Foreach,Break,php手册在“Changelog for break”下声明: 5.4.0取消了将变量(例如,$num=2;break$num;)作为数值参数传递的功能。 我有一个函数,可以将一个具有树结构的表复制到另一个表。 复制每个记录后,函数将测试一个关系,以查看该记录在树的下一个“级别”中是否有更多的子记录 如果找到子记录,则使用foreach()循环为每个子记录执行相同的函数。如果他们也有子记录,则重复该过程,等等 因此,表中“分支”和“级别”的数量将决定将执行多少foreach()循环。因为用户创建

php手册在“Changelog for break”下声明:

5.4.0取消了将变量(例如,$num=2;break$num;)作为数值参数传递的功能。

我有一个函数,可以将一个具有树结构的表复制到另一个表。 复制每个记录后,函数将测试一个关系,以查看该记录在树的下一个“级别”中是否有更多的子记录

如果找到子记录,则使用foreach()循环为每个子记录执行相同的函数。如果他们也有子记录,则重复该过程,等等

因此,表中“分支”和“级别”的数量将决定将执行多少foreach()循环。因为用户创建了记录,所以我无法控制表中“分支”和“级别”的数量

如果break不能再接收变量(我不能再运行“branch”和“level”计数器)-如果发生错误,如何中断所有循环

按比例缩小的示例:

public function copyTreeModels($row, $id)
{
    try
    {
        /* copy current record. */
        $status == 'ok';

        /* loop to this same function if $status == 'ok' and hasChildren */
        if($status == 'ok')
        {
            If ($row['hasChildren'] == 'yes') // check relation
            {
                foreach($row['children'] as $child)
                {
                    $this->copyTreeModels($child, $id);
                }
            }
        }
        else
        {   
            //  break;
            throw new CDbException($message);
        }
    }
    catch(CDbException $e)
    {
        $message .= $e->getMessage();
    }
    return($message);
}

我能想到的唯一一件事是设置一个变量,该变量决定是否打破所有

一个例子(未经测试)是

不过,我同意这不是一个很好的解决方案

编辑:

另一个建议是,如果嵌套循环的数量要
中断
from是一个可变量,它设置计数器并递减每次中断的中断计数器,并且仅当其大于0时才中断:

$break_count = 0;

foreach($values as $val) {
    foreach($val as $val1) {
        foreach($val1 as $val2) {
            if($val2 == "xyz") {
                $break_count = 3;
            }
            if($break_count > 0) { $break_count--; break; }
        }
        if($break_count > 0) { $break_count--; break; }
    }
    if($break_count > 0) { $break_count--; break; }
}

不要在递归函数中放入
try
。在建立条件处理程序的整个过程中,您需要一个包装函数:

public function copyTreeModels($row, $id) {
    try {
        $this->copytreeModelsRecurse($row, $id);
    }
    catch(CDbException $e)
    {
        $message .= $e->getMessage();
    }
    return($message);
}

copytremodelsrearch
将是您的
copytremodels
函数,但如果没有
try/catch
块。

如果不查看代码,很难给出详细的建议。但我的猜测是,您只需要将其作为递归函数编写,并通过递归返回。对于错误处理,请使用
try
catch
、和
throw
。Hi@Barmar。这不会浪费很多时间吗?当你已经有错误时,继续进行所有的递归?我确实使用了try、catch和throw,但它只是返回到更高的循环。我将尝试第二次抛入接球。你应该只在最高级别使用
try
,而不是每一个级别。嗨@Ryan。谢谢你的评论。(不是我被否决了)我加了一个小例子。如您所见,函数被重新调用的次数未知。因此,我不能使用固定数量的嵌套foreach()语句。你会如何处理这个问题?可能是因为它不是递归的。他需要复制任意深度的树,你不能硬编码循环。事实上,此代码不需要可变的中断级别,您可以将
break 3
放在最里面的循环中。@GerhardLiebenberg-使用我答案中的第二个示例,您不能为每个循环增加
$break\u计数
。在你的循环中使用类似于
if($error&&$break\u count>0){$break\u count--;break;}
的东西?我想我必须这样做——让每个循环中断1;但这难道不是一条腰围,因为即使你在第一条记录上有一个错误,你仍然需要遍历所有记录。为什么?如果你爆发了,它将终止loopYeehaa,@Barmar,它将继续工作。显然,我的函数为所有foreach()循环生成了try/catch语句。因此,我的异常只停止了最内部的循环。很多人都是同性恋。
public function copyTreeModels($row, $id) {
    try {
        $this->copytreeModelsRecurse($row, $id);
    }
    catch(CDbException $e)
    {
        $message .= $e->getMessage();
    }
    return($message);
}