PHP foreach语句中是否可以包含if/else


Can PHP foreach statements have if/else inside them?

我正在对订单总额进行OpenCart修改。这是代码片段:

<?php
foreach ($data['totals'] as $total) {
    if (
        $this->db->escape($total['code'])=="sub_total" ||
        $this->db->escape($total['title'])="Sub-Total" 
    ) {
        $this->db->query("INSERT INTO " . DB_PREFIX . "order_total SET order_id = '" . (int)$order_id . "', code = '" . $this->db->escape($total['code']) . "', title = '" . $this->db->escape($total['title']) . "', text = '" . $this->db->escape($total['text']) . "', `value` = '" . (float)$data['total'] . "', sort_order = '" . (int)$total['sort_order'] . "'");
    } else {
        $this->db->query("INSERT INTO " . DB_PREFIX . "order_total SET order_id = '" . (int)$order_id . "', code = '" . $this->db->escape($total['code']) . "', title = '" . $this->db->escape($total['title']) . "', text = '" . $this->db->escape($total['text']) . "', `value` = '" . $_SESSION['GCFinalOrderTotalIncludingDelivery'] . "', sort_order = '" . (int)$total['sort_order'] . "'");
    }
}
?>

这是伪代码。IF/Else是否可以嵌套在foreach语句中?

<?php
foreach ($d['totals'] as $total) {
    if ($query=="x" ||  $query=="y") {
        a();
    } else {
        b();
    }
}
?>

当然可以。

要用30个字符来表达这一点是相当困难的。

当然可以。不清楚你的问题是什么,但假设你在这行有一个拼写错误:

$this->db->escape($total['title']) = "Sub-Total" 

应该是这样的:

$this->db->escape($total['title']) == "Sub-Total" 

我想你现在已经知道了:"是的,他们可以!"。然而:如果你的循环没有那么大,你可能需要重新思考这两个分支之间的实际区别。举个伪代码的例子:如果分支是根据一个不是从循环本身提供的变量派生的值来决定的,那么你最好移动分支:

foreach($someArr as $k=>$v)
{
    if ($someOtherVar === true)
    {
        echo 'The value is '.$v;
    }
    else
    {
        echo 'The key is '.$k;
    }
}

可以(也应该)写成:

$str = 'The '.($someOtherVar === true ? 'value' : 'key').' is ';
foreach($someArr as $k=>$v)
{
    echo $str.$v;
}

是的,你可以这样做。这也很常见。不过,请确保在测试时使用==;你有=作为你的测试。

在OpenCart中,您试图编辑的文件我认为是订单模型?

/controlog/meodel/checkout/order.php

您有一个问题,丢失了两个由FAngel提到的==,但问题在于您的浮动。数据属性在该函数中被删除。因为Data数组已不在该代码段中。它依赖于TOTAL:

所以你的线路:

$this->db->query("INSERT INTO " . DB_PREFIX . "order_total SET order_id = '" . (int)$order_id . "', code = '" . $this->db->escape($total['code']) . "', title = '" . $this->db->escape($total['title']) . "', text = '" . $this->db->escape($total['text']) . "', `value` = '" . (float)$data['total'] . "', sort_order = '" . (int)$total['sort_order'] . "'");

应该是:(注意新的(float)$total['value']

$this->db->query("INSERT INTO " . DB_PREFIX . "order_total SET order_id = '" . (int)$order_id . "', code = '" . $this->db->escape($total['code']) . "', title = '" . $this->db->escape($total['title']) . "', text = '" . $this->db->escape($total['text']) . "', `value` = '" . (float)$total['value'] . "', sort_order = '" . (int)$total['sort_order'] . "'");

这意味着它将是:

#######
// WAS (float)$data['value'] 
// NOW (float)$total['value']
#######
foreach ($data['totals'] as $total) {
    if (
    $this->db->escape($total['code'])=="sub_total" ||
    $this->db->escape($total['title'])=="Sub-Total" 
    ) {
        $this->db->query("INSERT INTO " . DB_PREFIX . "order_total SET order_id = '" . (int)$order_id . "', code = '" . $this->db->escape($total['code']) . "', title = '" . $this->db->escape($total['title']) . "', text = '" . $this->db->escape($total['text']) . "', `value` = '" . (float)$total['value'] . "', sort_order = '" . (int)$total['sort_order'] . "'");
    } else {
        $this->db->query("INSERT INTO " . DB_PREFIX . "order_total SET order_id = '" . (int)$order_id . "', code = '" . $this->db->escape($total['code']) . "', title = '" . $this->db->escape($total['title']) . "', text = '" . $this->db->escape($total['text']) . "', `value` = '" . $_SESSION['GCFinalOrderTotalIncludingDelivery'] . "', sort_order = '" . (int)$total['sort_order'] . "'");
    }
}

绝对是。否则,拥有一种编程语言有什么意义呢。