【发布时间】:2014-06-30 19:07:03
【问题描述】:
我需要包含一个外部 php 文件,然后执行一些代码,最后包含最终文件但是由于第一个文件有 foreach 的开头,第二个文件有 foreach 的结尾,所以它不起作用:
主脚本:
if ($conditionMet) include('begin.php');
echo 'blablabla';
... do more stuff
if ($conditionMet) include('end.php');
开始.php:
foreach (array(1,2,3,4) as $id):
end.php:
endforeach;
当然不行。我想可能是因为在包含 begin.php 之后 php 不知道从哪里开始在 foreach 中再次循环,但这不是因为如果我这样做它会起作用:
if ($conditionMet) eval('foreach (array(1,2,3,4) as $id):');
echo 'blablabla';
if ($conditionMet) eval('endforeach;');
不能用eval写这样的代码,我不喜欢用eval,而且我还有更多的代码要放在begin.php和end.php中
更新:
我为什么要这样做以及代码的目的似乎有些混乱。我认为简化代码以获得直接的解决方案会更好,但看起来我只会让它变得更糟,所以我会解释更多:
如果您忘记了两个主脚本if,那么echo 'bablabla; 行实际上是包含foreach 循环的大量代码,它通过关联数组并输出正确的html。例如,数组将是这样的:
array(
array('product'=>'carrot', 'price'=>5),
array('product'=>'onion', 'price'=>4),
array('product'=>'apple', 'price'=>2)
);
现在在某些情况下,数组会略有不同,如下所示:
array(
array('product'=>'carrot', 'price'=>5, 'category'=>'vegetable'),
array('product'=>'onion', 'price'=>4, 'category'=>'vegetable'),
array('product'=>'apple', 'price'=>2, 'category'=>fruit')
);
此时$conditionMet 为真,所以在“begin.php”中,它会像这样重建数组:
foreach ( regorganizeArray($productsArray) as $productsArray)
成为
array(
array(
array('product'=>'carrot', 'price'=>5, 'category'=>'vegetable'),
array('product'=>'onion', 'price'=>4, 'category'=>'vegetable'),
),
array('product'=>'apple', 'price'=>2, 'category'=>fruit')
)
);
然后会显示额外的东西
<h4>vegetables</h4>
然后主脚本的其余部分与主脚本无缝执行,只显示数组的内容,甚至不知道有什么区别。
最后,“end.php”结束了foreach。
现在您可能都认为我应该将主脚本的代码放在一个函数中,但它有多个版本(主题),而且它们从不做确切的事情。所有不同版本的主脚本的唯一共同点是输入数组是相同的。
你去吧,抱歉所有的混乱,我不会是一个真正的好老师,因为我不善于解释,但我希望这能让事情更清楚。
【问题讨论】:
-
这甚至不是有效的 PHP 代码...
-
我写了一个简化的例子,甚至没有注意到错误。无论如何,现在修复它。不会改变它不起作用的事实..
-
控制结构只能嵌套
-
为什么要使用 if 语句来关闭循环?这需要始终发生
-
由于多种原因它无法正常工作,但即使您将包含并排放置而不是在条件块中,它也不起作用,因为第一个包含脚本中的未闭合循环将无法解析. PHP 将包含的代码作为独立脚本运行,它不只是流式传输代码并相信它最终会有效。 (实际上我只是因为你的问题才知道这一点,或者我可能有一天自己偶然发现了这个问题。)
标签: php foreach include require php-include