PHP foreach循环分为两个不同的包含文件

时间:2014-05-13 07:55:03

标签: php foreach include require php-include

我需要包含一个外部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。

现在你可能都认为我应该将主脚本的代码放在一个函数中,但它有几个版本(主题),它们从不做确切的事情。主脚本的所有不同版本的共同点是输入数组是相同的。

你去了,抱歉所有的困惑,我不会是一个非常好的老师,因为我不好解释,但我希望这会让事情变得更清楚。

3 个答案:

答案 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); 
  }
}