3

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

结束.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。

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

好了,抱歉所有的混乱,我不会是一个真正的好老师,因为我不善于解释,但我希望这能让事情更清楚。

4

3 回答 3

1

在预处理完成之前,每个 php 文件都必须在语法上有效,因此由于 begin.php 中有语法错误,因此请求将失效并且您将遇到语法错误。

于 2014-05-13T08:26:14.577 回答
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 次,第一次你会得到蔬菜数组,第二次你会得到水果数组。

于 2014-05-13T08:24:21.293 回答
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); 
  }
}
于 2014-05-13T08:23:05.623 回答