php手册在'Changelog for break‘下面声明:
5.4.0删除了将变量(例如,$num = 2;断开$num;)作为数值参数传递的能力。
我有一个函数,它将具有树结构的表复制到另一个表中。复制每个记录后,函数测试一个关系,以查看该记录在树的下一个“级别”中是否有更多的子记录。
如果找到子记录,则使用foreach()循环对每个子记录执行相同的函数。如果他们也有孩子的记录,这个过程会被重复等等。
因此,表中“分支”和“级别”的数量将决定将执行多少foreach()循环。由于用户创建了记录,我无法控制表中“分支”和“级别”的数量。
如果中断不能再接收变量(我再也不能运行“分支”和“级别”计数器)--如果发生错误,如何从所有循环中分离出来?
缩小的例子:
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);
}
发布于 2014-01-15 04:00:08
不要将try
放在递归函数中。在建立条件处理程序的整个过程中,您需要一个包装函数:
public function copyTreeModels($row, $id) {
try {
$this->copytreeModelsRecurse($row, $id);
}
catch(CDbException $e)
{
$message .= $e->getMessage();
}
return($message);
}
然后,copyTreeModelsRecurse
将成为您的copyTreeModels
函数,但不需要try/catch
块。
发布于 2014-01-15 03:08:52
我唯一能想到的就是设置一个变量,它决定是否打破所有。
一个例子(未经测试)是
$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时才中断:
$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; }
}
https://stackoverflow.com/questions/21135625
复制