如何用PHP比较两个foreach循环中的两个数组?

时间:2017-08-15 20:15:39

标签: php mysql session foreach

我希望我忽略了一些简单的事情,并且我没有以如此疯狂和复杂的方式写出这些内容,以至于我无法实现我想要的目标。

我为PHP混入的巨大混乱道歉。我的计划是在我能够开展工作之后将我能做的事情分开。这是我写的第三个应用程序,所以我仍在学习基础知识,可能是写意大利面条代码。 这是我正在使用的查询,它将根据另一个查询的结果进一步改变代码而改变。

我想查看选择并发送到$_POST此页面的日期是否已经在用户的购物车即行程中。

<?php foreach($unique as $ukey => $uval) : ?>
<?php
// regular query to search for all room bookings
  try {
    $sqlSlctAll = "SELECT * FROM dates_booked 
                   INNER JOIN rooms
                   WHERE rooms.id = dates_booked.room_num
                   AND rooms.name = '$uval'
                   GROUP BY rooms.id
                   ";
                   // using group by here will not return all booked days
    $slctStmtAll = $dsn->prepare($sqlSlctAll);
    $slctStmtAll->execute();
    $allResults = $slctStmtAll->fetchAll(PDO::FETCH_ASSOC);
    foreach ($allResults as $allrow) {
      $uValArray[] = [
        'id' => $allrow['id'],
        'name' => $allrow['name'],
        'price' => $allrow['price'],
        'dateStart' => $allrow['dateStart'],
        'dateEnd' => $allrow['dateEnd']
      ];
    }
    // header('Content-type: application/json');
  } catch (PDOException $e) {
    echo 'Error selecting dates: ' . $e->getMessage();
  }
?>

这就是我开始迷惑的地方。发生的事情是如果$_SESSION['shopping_cart']中只有一个项目,我试图创建的表格就好了。对于之后的每个项目,我添加到购物车,它首先比较首先查看日期范围是否已经在会话数组中,然后购物车'id'是否与数据库中房间的id匹配。因此,对于第一次迭代,它可能返回true或false,然后在下一次迭代中返回相反的内容,并在我的表中添加额外的<td>

  <table class="table table-bordered">
    <thead>
      <tr>
        <th>Room Name</th>
        <th>Price Per Night</th>
        <th>Room ID</th>
        <th>Action</th>
      </tr>
    </thead>
    <tbody>
      <?php foreach ($uValArray as $aRoom) : ?>
  <form action="cart.php?id=<?php echo $aRoom['id']; ?>" method="post">
      <tr>
      <td><?php echo $aRoom['name']; ?></td>
      <td>$<?php echo $aRoom['price']; ?></td>
      <td><?php echo $aRoom['id']; ?></td>
      <?php 
      if(isset($_SESSION['shopping_cart'])) {
        foreach ($_SESSION['shopping_cart'] as $cart) {
          if(
            $chooseStart < $cart['dateEnd'] && 
            $cart['dateStart'] < $chooseEnd && 
            $aRoom['id'] == $cart['id']
            ) {
            echo '<td><a href="cart.php">in your itinerary</a></td>';
          } else {
            echo '<td><input class="btn btn-success" type="submit" name="book_now" value="Book Now"></td>';
          }
        }
      } else {
        echo '<td><input class="btn btn-success" type="submit" name="book_now" value="Book Now"></td>';
      }
      ?>
      <input type="hidden" name="dateStart" value="<?php echo $chooseStart; ?>"> 
      <input type="hidden" name="dateEnd" value="<?php echo $chooseEnd; ?>"> 
      <input type="hidden" name="name" value="<?php echo $aRoom['name']; ?>"> 
      <input type="hidden" name="price" value="<?php echo $aRoom['price']; ?>">
      <input type="hidden" name="room_quantity" value="1">
  </form>
      <?php endforeach; ?>
    </tbody>
  </table>

<?php } ?>

如果我的购物车中有两件物品,我可以在我的'可用性搜索页面中找到它:

available rooms with 2 items in shopping cart

我感到非常难过,因为我想将$aRoom['id']项目与$cart['id']进行比较,但我无法弄清楚如何在不通过购物车的情况下进行操作。我不确定这是否有意义。

如果我在比较后取出else语句中的echo '<td>',它最终会给我我想要的表结构,减去我需要的实际'book_now'输入。

  <table class="table table-bordered">
    <thead>
      <tr>
        <th>Room Name</th>
        <th>Price Per Night</th>
        <th>Room ID</th>
        <th>Action</th>
      </tr>
    </thead>
    <tbody>
      <?php foreach ($uValArray as $aRoom) : ?>
  <form action="cart.php?id=<?php echo $aRoom['id']; ?>" method="post">
      <tr>
      <td><?php echo $aRoom['name']; ?></td>
      <td>$<?php echo $aRoom['price']; ?></td>
      <td><?php echo $aRoom['id']; ?></td>
      <?php 
      if(isset($_SESSION['shopping_cart'])) {
        foreach ($_SESSION['shopping_cart'] as $cart) {
          if(
            $chooseStart < $cart['dateEnd'] && 
            $cart['dateStart'] < $chooseEnd && 
            $aRoom['id'] == $cart['id']
            ) {
            echo '<td><a href="cart.php">in your itinerary</a></td>';
          } else {
            echo '';
          }
        }
      } else {
        echo '<td><input class="btn btn-success" type="submit" name="book_now" value="Book Now"></td>';
      }
      ?>
      <input type="hidden" name="dateStart" value="<?php echo $chooseStart; ?>"> 
      <input type="hidden" name="dateEnd" value="<?php echo $chooseEnd; ?>"> 
      <input type="hidden" name="name" value="<?php echo $aRoom['name']; ?>"> 
      <input type="hidden" name="price" value="<?php echo $aRoom['price']; ?>">
      <input type="hidden" name="room_quantity" value="1">
  </form>
      <?php endforeach; ?>
    </tbody>
  </table>

最终看起来像这样,这是我想要的,但使用输入按钮:

table without the 'book_now' input

如果我需要澄清任何事情,请告诉我,我会尽力而为。我的一个问题是,我很难真正知道我的问题是什么,因为我还是初学者。我希望有人遇到类似的问题,并且知道我想问的是什么。

我尝试在MySQL查询中使用不同的GROUP BY,但无济于事。但我很确定这与我的问题无关。我很确定我的问题是$aRoom正在与购物车中的每个项目进行比较,我只想比较一次,但我无法弄清楚如何在不使用foreach循环的情况下进行比较{ {1}}。

修改

我试图在链接帖子中使用Barmar的建议,他提到“简单修改是使用一个跟踪你是否找到某个东西的变量,然后在循环结束时检查这个变量” 我目前正在尝试将变量设置为1或0,具体取决于if语句的计算方式。

这就是我所做的:

$_SESSION['shopping_cart']

我已经尝试将if(isset($_SESSION['shopping_cart'])) {; foreach ($_SESSION['shopping_cart'] as $cart) { if( $chooseStart < $cart['dateEnd'] && $cart['dateStart'] < $chooseEnd && $aRoom['id'] == $cart['id'] ) { $info = 1; } else { $info = 0; } } } else { $info = 0; } if($info == 1) { echo "<td><a href='cart.php'>in your itinerary</a></td>"; } else { echo "<td><input class='btn btn-success' type='submit' name='book_now' value='Book Now'></td>"; } 逻辑放在if ($info == 1)循环中的不同位置 - 循环结束后,就在它完成之前。在循环之后,它不返回每个值,因为它没有过滤循环的每次迭代。因此,只评估数组中的第一项。我想再次遍历会话数组。我试过了,在那时它没有用$ aRoom变量对另一个foreach循环进行评估。

我不希望任何人告诉我该怎么做,就像给我一些提示或其他东西一样。我想了解它,并且不想复制粘贴某人的代码。

任何人都可以给我一个提示,比如内置的PHP函数会有所帮助吗? PHP有许多数组函数。我尝试过array_diff,我试过获取array_column并使用它,尝试合并数组并从中获取唯一值。我目前正在研究foreach($_SESSION['shopping_cart']

0 个答案:

没有答案