首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在php5.4中,在失去接收变量的能力之后,如何使用中断?

在php5.4中,在失去接收变量的能力之后,如何使用中断?
EN

Stack Overflow用户
提问于 2014-01-15 11:01:00
回答 2查看 222关注 0票数 1

php手册在'Changelog for break‘下面声明:

5.4.0删除了将变量(例如,$num = 2;断开$num;)作为数值参数传递的能力。

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

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

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

如果中断不能再接收变量(我再也不能运行“分支”和“级别”计数器)--如果发生错误,如何从所有循环中分离出来?

缩小的例子:

代码语言:javascript
运行
复制
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);
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-01-15 12:00:08

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

代码语言:javascript
运行
复制
public function copyTreeModels($row, $id) {
    try {
        $this->copytreeModelsRecurse($row, $id);
    }
    catch(CDbException $e)
    {
        $message .= $e->getMessage();
    }
    return($message);
}

然后,copyTreeModelsRecurse将成为您的copyTreeModels函数,但不需要try/catch块。

票数 1
EN

Stack Overflow用户

发布于 2014-01-15 11:08:52

我唯一能想到的就是设置一个变量,它决定是否打破所有。

一个例子(未经测试)是

代码语言:javascript
运行
复制
$break_all = false;
foreach($values as $val) {
    foreach($val as $val1) {
        foreach($val1 as $val2) {
            if($val2 == "xyz") {
                $break_all = true;
            }
            if($break_all) break;
        }
        if($break_all) break;
    }
    if($break_all) break;
}

不过,我同意这并不是一个很好的解决办法。

编辑:

另一种建议是,如果嵌套的break;循环的数量是可变的,则设置一个计数器并减少每个中断的中断计数器,并且只有当它大于0时才中断:

代码语言:javascript
运行
复制
$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; }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21135625

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档