PHP 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'

我需要包含一个外部php文件,然后执行一些代码,最后包含最终文件,但由于第一个文件的开头是foreach,第二个文件的结尾是foreach,因此无法工作:

主脚本:

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'”代码实际上要大得多。我添加了一些说明,以便您更好地了解我的观点,谢谢!