我需要包含一个外部php文件,然后执行一些代码并最终包含最终文件但是因为第一个文件有foreach的开头而第二个文件有foreach的结尾,所以它不是工作:
主脚本:
if ($conditionMet) include('begin.php');
echo 'blablabla';
... do more stuff
if ($conditionMet) include('end.php');
begin.php:
foreach (array(1,2,3,4) as $id):
end.php:
endforeach;
当然它不起作用。我想也许是因为php不知道在begin.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>
然后,主脚本的其余部分与主脚本无缝地执行,只显示数组的内容,甚至不知道存在差异。
最后,&#34; end.php&#34;结束了foreach。
现在你可能都认为我应该将主脚本的代码放在一个函数中,但它有几个版本(主题),它们从不做确切的事情。主脚本的所有不同版本的共同点是输入数组是相同的。
你去了,抱歉所有的困惑,我不会是一个非常好的老师,因为我不好解释,但我希望这会让事情变得更清楚。
答案 0 :(得分:1)
为什么不简单地执行以下操作:
$productsArray = array(...) ; // This is what you have at the beginning
if ($conditionMet) {
$productsArray = regorganizeArray($productsArray) ;
}
else {
$productsArray = array($productsArray, ) ;
}
foreach ($productsArray as $productsArr) {
// Do whatever you want
}
如果你有这个数组:
$productsArray = array(
array('product'=>'carrot', 'price'=>5),
array('product'=>'onion', 'price'=>4),
array('product'=>'apple', 'price'=>2)
);
如果条件不满足,您将创建类似的内容:
$productsArray = array(
array(
array('product'=>'carrot', 'price'=>5),
array('product'=>'onion', 'price'=>4),
array('product'=>'apple', 'price'=>2)
)
);
因此foreach
语句将循环一次,并且它循环$productsArr
的唯一时间将包含第一个数组。
如果不符合条件,您将获得(重组后)此数组:
array(
array(
array('product'=>'carrot', 'price'=>5, 'category'=>'vegetable'),
array('product'=>'onion', 'price'=>4, 'category'=>'vegetable'),
),
array(
array('product'=>'apple', 'price'=>2, 'category'=>'fruit')
)
);
你将循环2次,首先你将获得蔬菜阵列,第二次获得水果阵列。
答案 1 :(得分:1)
每个php文件在预处理完成之前必须在语法上有效,所以因为你在begin.php中有语法错误,所以请求将会死亡,并且你会遇到语法错误。
答案 2 :(得分:0)
这种方法不起作用,因为它不是有效的PHP。不完全确定为什么你需要一个单独的php文件来执行循环,但如果你需要,你可以使用函数和回调,如下所示:
在主脚本中:
if ($conditionMet) {
include('loopscript.php')
performTheLoop('doMyStuff')
} else {
doMyStuff();
}
function doMyStuff() {
echo 'blablabla';
}
在loopscript.php中:
function performTheLoop($callback) {
foreach (array(1,2,3,4) as $id) {
call_user_func($callback);
}
}