【问题标题】:PHP foreach loop separated in two different included filesPHP foreach 循环分隔在两个不同的包含文件中
【发布时间】:2014-06-30 19:07:03
【问题描述】:

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

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,那么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。

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

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

【问题讨论】:

  • 这甚至不是有效的 PHP 代码...
  • 我写了一个简化的例子,甚至没有注意到错误。无论如何,现在修复它。不会改变它不起作用的事实..
  • 控制结构只能嵌套
  • 为什么要使用 if 语句来关闭循环?这需要始终发生
  • 由于多种原因它无法正常工作,但即使您将包含并排放置而不是在条件块中,它也不起作用,因为第一个包含脚本中的未闭合循环将无法解析. PHP 将包含的代码作为独立脚本运行,它不只是流式传输代码并相信它最终会有效。 (实际上我只是因为你的问题才知道这一点,或者我可能有一天自己偶然发现了这个问题。)

标签: php foreach include require php-include


【解决方案1】:

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

【讨论】:

  • 好点。我正在研究一个可以避免纠缠的控制块并且只有include($start); include($end); 并排的答案,但是即使按照您的观点,“正确”地做那部分也行不通。它在第一个包含时引发解析错误,因为循环没有关闭。因此,OP 方法存在根本缺陷,因为没有正确的方法将循环拆分到多个脚本中。
  • 我也是这么想的,但是为什么它与 eval() 一起工作?
  • @NaturalBornCamper - 我认为你错了。尝试在没有条件检查的情况下在独立脚本中运行 eval 示例,例如:eval('foreach (array(1,2,3,4) as $id):'); echo 'blablabla'; eval('endforeach;'); 当我运行此程序时,我会收到每个 eval 和两者之间的 blablabla 的解析错误。我认为您的基本假设是基于不完美的测试。我用 PHP 5.3 和 5.4 测试过
  • 该死,你是对的,我测试了一个不同的场景,但它不起作用。结果错误地让我认为它正在工作。好吧,评估我的 B 计划,现在不知道该怎么办
【解决方案2】:

为什么不简单地做这样的事情:

$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 次,第一次你会得到蔬菜数组,第二次你会得到水果数组。

【讨论】:

  • 我添加了更多说明!对此感到抱歉!
  • @NaturalBornCamper 我更新了我的代码。这个想法是总是有一个循环,但只在条件不满足时循环一次。不知道是不是你想要的。
  • 谢谢霍尔特!不幸的是,foreach 中的代码会崩溃,因为如果它被重新组织,它不再是一个产品数组,而是一个 (array of (array of products))
  • @NaturalBornCamper 是的,这就是我添加else 块的原因,所以如果你不重新组织代码,你总是有一个产品数组,并且在每个循环中你都有一个数组产品。它可以工作,除非你在 foreach 循环中有条件语句来检查conditionMet
  • @NaturalBornCamper 我在我的回答中添加了解释。
【解决方案3】:

这种方法不起作用,因为它不是有效的 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); 
  }
}

【讨论】:

  • 我想避免代码重复,这就是我不想做if +else语句的原因。 “echo 'blablabla'”代码实际上要大得多。我添加了一些说明,以便您更好地了解我的观点,谢谢!
猜你喜欢
  • 1970-01-01
  • 2021-12-18
  • 2018-01-31
  • 2012-02-04
  • 2020-03-09
  • 1970-01-01
  • 1970-01-01
  • 2011-06-01
  • 2012-10-27
相关资源
最近更新 更多