【问题标题】:Why is my conditional statement not executing multiple times in a foreach loop? PHP为什么我的条件语句没有在 foreach 循环中多次执行? PHP
【发布时间】:2021-12-24 21:26:09
【问题描述】:

我正在尝试打印与客户列表匹配的订单信息,具体取决于订单上的客户 ID 是否与客户的客户 ID 匹配。客户和订单都存储在数组中,到目前为止,执行订单表和打印信息都没有问题。我遇到的问题是只有一个订单正在为客户打印,而一些客户有多个应该打印的订单。我使用了一个 foreach 循环来遍历将订单 id 匹配到请求的客户 id 的订单,该客户 id 来自查询字符串。当我知道至少有 1 个正在打印时,我不知道为什么我的 if 语句没有打印多个订单。

这是我的客户表的代码,当返回带有客户 ID 的查询字符串时执行该代码。底部的 foreach 循环是我期望打印所有匹配订单的地方,但是当我期望在某些情况下多个订单时,它只给我一个订单。如果需要任何其他信息,我可以提供。谢谢

<?php

if ($_SERVER['REQUEST_METHOD'] == 'GET') {
    if (isset($_GET['customer'])) {

        $requestedCustomer = $customers[$_GET['customer']];

        $orders = readOrders('orders.txt');

【问题讨论】:

  • 当你转储$requestedCustomer['id']$orders时你会得到什么数据?
  • 底部的foreach?你的意思是被注释掉的那个?
  • 小点 这行echo '&lt;/table&gt;';应该在IF里面而不是外面
  • 这有意义吗?? if ($requestedCustomer['id'] == $order['id']) {
  • Customers Id 与 Order Id 相同让我有点惊讶

标签: php html web


【解决方案1】:

您是否检查过为什么会发生这种情况?一个 ID 不能在同一个数组中多次使用,所以如果你解析多个具有相同 ID 的行并将它们写入到数组中使用相同的 ID,你将覆盖之前的订单。只能访问具有该 ID 的最后一个订单。通过比较已解析的订单数组和包含订单的文件,应该很容易看到。

这就是为什么您通常使用唯一订单 ID,并将用户 ID 存储在该订单中

【讨论】:

    【解决方案2】:

    我认为您的问题出在readOrders。你似乎每次都用$orders[$order['id']] = $order; 破坏你的数组,而不是你想要$orders[$order['id']][] = $order;

    function readOrders($filename)
    {
        $arr = file($filename) or die('ERROR: Cannot find file');
    
        // Create our primary order array
        $orders = [];
    
        $delimiter = ',';
    
        // reading in customers from file and storing in array of customers
    
        foreach ($arr as $line) {
    
            $splitcontents = explode($delimiter, $line);
    
            $order = array();
    
            $order['id'] = $splitcontents[1];
            $order['isbn'] = $splitcontents[2];
            $order['title'] = utf8_encode($splitcontents[3]);
            $order['category'] = utf8_encode($splitcontents[4]);
    
            // Append the order to the array, 
            $orders[$order['id']][] = $order;
        }
        return $orders;
    }
    

    然后,在您的打印循环中,您不会遍历 $orders,而是采用由客户 ID 索引的主订单数组并获取这些特定订单。

    // Get the orders for this specific customer, if they exist
    $customerOrders = $orders[$requestedCustomer['id']] ?? [];
    foreach ($customerOrders as $order) {
        echo '<tr>';
        echo '<td>' . $order['isbn'] . '</td>';
        echo '<td>' . $order['title'] . '</td>';
        echo '<td>' . $order['category'] . '</td>';
        echo '</tr>';
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-01-01
      • 1970-01-01
      • 2013-11-06
      • 2021-01-27
      • 1970-01-01
      • 2017-02-08
      • 1970-01-01
      • 2020-11-28
      相关资源
      最近更新 更多