【问题标题】:PHP foreach loop only display selected option if a value is selected from top order如果从最高顺序选择了一个值,PHP foreach 循环仅显示选定的选项
【发布时间】:2019-04-08 07:54:09
【问题描述】:

我在宾馆的桌子上有 5 个房间,用户必须检查他们想要预订的一个或多个房间,并选择他们希望拥有的选项,例如人数、早餐选项、晚餐选项和床位选项。

为了解释发生了什么问题,让我举一些例子:

假设我们按外观顺序调用 5 个房间:

元房

地球房间

水房

空气室

消防室

假设我使用任何下拉值检查元素房间和地球房间,我得到以下例如:

元素房

人数:1

晚餐套餐:120

早餐:70

床:特大床

&&

地球房间

人数:2

晚餐套餐:200

早餐:70

床:2 张单人床

上面确实给出了正确的输出。

但现在我只选择 Water 房间或 Element 房间下方显示的任何其他房间:

我明白了:

水房(或除 Element 房外的任何房间)

人数:0

晚餐课程:0

早餐:0

床:选择床尺寸

如果我从 Element 房间向下选择每个房间,我会正确获得所有值,但如果我选择 Element 房间,然后选择 Air 房间(不选择 Earth 房间),那么我会得到:

元素房

人数:1

晚餐套餐:120

早餐:70

床:特大床

&&

空气室

人数:0

晚餐课程:0

早餐:0

床:选择床尺寸

就好像我的代码只会按顺序从上到下循环每个值,而不是中间的其他选定值,但检查的房间总是正确的,而不是选定的选项。

这是我的 HTML:

<form class="booking-form" name="book-room-form" action="" id="contactForm" method="post" novalidate>

<?php foreach ( $rooms as $room ) : ?>

<input type="checkbox" class="form-check-input" name="room-selected[]" value="<?php echo $room->post_title; ?>">

<select class="num-person select-update" id="<?php echo 'r-' . $room->ID; ?>" name="people-select[]" required>
  <option value="0" selected>Select Number of Persons</option>
  <option value="1">1 person R600</option>
  <option value="2">2 persons R800</option>
</select>

<select class="num-dinner select-update" id="<?php echo 'd-' . $room->ID; ?>" name="dinner-select[]">
    <option value="0" selected>Select Dinner Course</option>
    <option value="120">Two Course Dinner R120</option>
    <option value="200">Three Course Dinner R200</option>
</select>

<select class="num-bf select-update" id="<?php echo 'b-' . $room->ID; ?>" name="breakfast-select[]">
    <option value="0" selected>Select Breakfast Type</option>
    <option value="70">Basic Breakfast R70</option>
    <option value="120">Full Breakfast R120</option>
</select>

<select class="bed-select" name="bed-select[]">
    <option selected>Select Bed Size</option>
    <option value="King Bed">King Bed</option>
    <option value="2 Single Beds">2 Single Beds</option>
</select>



<?php endforeach; ?>

    <button name="submit-request" type="submit" class="btn btn-primary">Submit</button>
</form>

这是我的代码:

if(isset($_POST['submit-request'])) {

    $room_selected = $_POST['room-selected'];
    $numPeople = $_POST['people-select'];
    $dinnerSelect = $_POST['dinner-select'];
    $breakfastSelect = $_POST['breakfast-select'];
    $bedSelect = $_POST['bed-select'];

    $room = $room_selected;
    $num = $numPeople;
    $dinn = $dinnerSelect;
    $bf  = $breakfastSelect;
    $bed = $bedSelect;

    foreach ($room as $id => $key) {
    //$key returns the room name
      if($key) {
        $result[$key] = array(
            'num_person'  => $num[$id],
            'dinner' => $dinn[$id],
            'breakfast'    => $bf[$id],
            'bed_type' => $bed[$id],
        );
    }

    echo $key . '<br/>' . $num[$id] . '<br/>' . $dinn[$id] . '<br/>' . $bf[$id] . '<br/>' . $bed[$id] . '<br/>' ;

    }

}

【问题讨论】:

    标签: php html post foreach


    【解决方案1】:

    会发生这种情况,因为只有选中的复选框才会通过 Post-Request 传输。因此,例如,如果您的 Element Room 和 Earth Room 被选中,您将获得:

    $_POST[room-selected] => Array
            (
                [0] => Element Room
                [1] => Earth Room
            )
    

    但是,如果您选择任何其他房间,该数组仍将以索引 0 开始。因此,按照您的示例,如果您只选择 Water Room,您将得到:

    $_POST[room-selected] => Array
            (
                [0] => Water Room
            )
    

    但是,选择字段将始终为您提供一个包含所有信息的数组,因为始终有一个值要传输。这意味着第一个选中的房间将始终引用您的 Select-Arrays 的第一个元素。

    您可以使用表单的字符串键来避免这种情况,例如:

    <input name="room-selected[<?php echo $room->post_title; ?>]" />
    

    之后您还必须更改您的 foreach-Loop 或 Select-Name-Arrays。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-05-18
      • 2015-10-08
      • 1970-01-01
      • 2014-02-03
      • 2012-06-19
      • 1970-01-01
      • 1970-01-01
      • 2016-09-01
      相关资源
      最近更新 更多