PHP foreach循环在两个不同的包含文件中分开
我需要包含一个外部php文件,然后执行一些代码,最后包含最终文件,但由于第一个文件的开头是foreach,第二个文件的结尾是foreach,因此无法工作: 主脚本:PHP foreach循环在两个不同的包含文件中分开,php,foreach,include,require,php-include,Php,Foreach,Include,Require,Php Include,我需要包含一个外部php文件,然后执行一些代码,最后包含最终文件,但由于第一个文件的开头是foreach,第二个文件的结尾是foreach,因此无法工作: 主脚本: if ($conditionMet) include('begin.php'); echo 'blablabla'; ... do more stuff if ($conditionMet) include('end.php'); if ($conditionMet) { include('loopscript.php'
if ($conditionMet) include('begin.php');
echo 'blablabla';
... do more stuff
if ($conditionMet) include('end.php');
if ($conditionMet) {
include('loopscript.php')
performTheLoop('doMyStuff')
} else {
doMyStuff();
}
function doMyStuff() {
echo 'blablabla';
}
begin.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
master脚本,那么行echo'babbala
实际上是很多代码,其中还包含一个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')
);
foreach ( regorganizeArray($productsArray) as $productsArray)
这是当$conditionMet
为true时,因此在“begin.php”中,它会像这样重建数组:
array(
array('product'=>'carrot', 'price'=>5, 'category'=>'vegetable'),
array('product'=>'onion', 'price'=>4, 'category'=>'vegetable'),
array('product'=>'apple', 'price'=>2, 'category'=>fruit')
);
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 ($conditionMet) include('begin.php');
echo 'blablabla';
... do more stuff
if ($conditionMet) include('end.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);
}
}
为什么不简单地做如下事情:
$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(
array('product'=>'carrot', 'price'=>5),
array('product'=>'onion', 'price'=>4),
array('product'=>'apple', 'price'=>2)
)
);
如果您有此阵列:
$productsArray = array(
array('product'=>'carrot', 'price'=>5),
array('product'=>'onion', 'price'=>4),
array('product'=>'apple', 'price'=>2)
);
array(
array(
array('product'=>'carrot', 'price'=>5, 'category'=>'vegetable'),
array('product'=>'onion', 'price'=>4, 'category'=>'vegetable'),
),
array(
array('product'=>'apple', 'price'=>2, 'category'=>'fruit')
)
);
如果不满足条件,您将创建如下内容:
$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(
array('product'=>'carrot', 'price'=>5),
array('product'=>'onion', 'price'=>4),
array('product'=>'apple', 'price'=>2)
)
);
因此,foreach
语句将循环一次,$productsArr
语句循环的唯一时间将包含第一个数组
如果不满足条件,则(重组后)将获得此数组:
$productsArray = array(
array('product'=>'carrot', 'price'=>5),
array('product'=>'onion', 'price'=>4),
array('product'=>'apple', 'price'=>2)
);
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次,第一次得到蔬菜数组,第二次得到水果数组。在预处理完成之前,每个php文件必须在语法上有效,因此,由于begin.php中存在语法错误,请求将被终止,您将出现语法错误。这甚至不是有效的php代码……我编写了一个简化的示例,甚至没有注意到错误。不管怎样,现在修好了。控制结构只能嵌套为什么要用if语句来关闭循环?由于多种原因,这需要始终保持occurIt不起作用,但即使您将include并排放置在条件块中,它也不会起作用,因为第一个包含的脚本中未关闭的循环将无法解析。PHP以独立脚本的形式运行包含的代码,它不只是在代码中进行流式处理,并相信它最终会有效。(事实上,我只是因为你的问题才知道这一点,否则我可能有一天自己也会遇到这个问题。)很好的观点。我正在研究一个答案,它可以避免纠缠的控制块,只需要
include($start);包括(完);代码>并排,但即使是“正确”地完成这一部分,也无法满足您的要求。它在第一个include上抛出一个解析错误,因为循环没有关闭。所以OPs方法从根本上说是有缺陷的,因为没有正确的方法将循环分割成多个脚本。这也是我的想法,但是为什么它与eval()一起工作?@naturalborncaper-我认为你错了。尝试在独立脚本中运行eval
示例,而不进行条件检查,例如:eval('foreach(数组(1,2,3,4)as$id):');回音“呜呜呜呜”;eval('endforeach;')代码>当我运行此命令时,我会为每个eval
返回一个解析错误,并在两者之间返回一个blabla
。我认为你的基本假设是基于一个不完美的测试。我用PHP5.3和5.4Damn进行了测试,你是对的,我测试了一个不同的场景,但它不起作用。结果让我误以为它起作用了。好吧,评估我的B计划,不知道现在该做什么我添加了更多的澄清!对不起@我更新了我的代码。其思想是始终有一个循环,但在不满足条件时只循环一次。不知道是否符合你的要求。谢谢霍尔特!不幸的是,foreach中的代码会崩溃,因为如果重新组织,它不再是产品数组,而是(产品数组))@naturalborncaper是的,这就是我添加else
块的原因,因此如果不重新组织代码,你总是有一系列的产品,在每个循环中你都有一系列的产品。它是有效的,除非在foreach循环中有conditional语句,检查conditionMet
@naturalborncaper我在答案中添加了解释。我想避免代码重复,这就是为什么我不想执行和if+else语句。“echo'blabla'”代码实际上要大得多。我添加了一些说明,以便您更好地了解我的观点,谢谢!