1

編集フォームをコーディングしていますが、以前にチェックしたチェックボックスをチェックする部分が正しく機能しません。

たとえば、データベースに 5 つのアイテムのリストがあり、以前にそのうちの 2 つをチェックしてフォームを保存したとします。フォームで編集を押すと、これをもう一度取得する必要があります。

[ ] Item 1
[X] Item 2
[ ] Item 3
[X] Item 4
[ ] Item 5

私は2つの配列を持っています:

  • $amenitiesデータベース内のすべての項目がここにあります。

  • $related以前にチェックした項目はすべてここにあります。(この場合は2つ)

2 つの配列を比較して比較するに$relatedはどう$amenitiesすればよいでしょうか。これは、その部分に関連する私のコードです。

$アメニティ (print_r)

  Array
(
    [0] => Array
        (
            [itemID] => 3
            [itemName] => Crema Chantilly
        )

    [1] => Array
        (
            [itemID] => 4
            [itemName] => Caribe Cooler
        )

    [2] => Array
        (
            [itemID] => 5
            [itemName] => Cacahuates Japoneses
        )

    [3] => Array
        (
            [itemID] => 6
            [itemName] => Cerveza Sol (lata)
        )

    [4] => Array
        (
            [itemID] => 7
            [itemName] => Chocolate derretido
        )

)

$関連 (print_r)

  Array
(
    [0] => Array
        (
            [itemID] => 3
            [itemName] => Crema Chantilly
        )

    [1] => Array
        (
            [itemID] => 4
            [itemName] => Caribe Cooler
        )

)

ご覧のとおり、 の 2 つのアイテム$relatedと一致する の 2 つのアイテムがあり$amenitiesます。

私がここで試しているのは、次のようなものです。

<?php foreach ($related as $single) : ?>

    <?php foreach ($amenities as $amenity) : ?>

      <?php if ( $single === $amenity) : ?>

        <input type="checkbox" class="left" checked="yes" name="amenities[]" value="<?=$amenity['itemID']?>">
        <label class="checkbox"><?=$amenity['itemName']?></label>

       <?php else : ?>

        <input type="checkbox" class="left" name="amenities[]" value="<?=$amenity['itemID']?>">
        <label class="checkbox"><?=$amenity['itemName']?></label>

      <?php endif ?>

    <?php endforeach;?>

<?php endforeach;?>

ただし、結果は完全なオプション リストに対して複製されています。私はこれを得ています:

[X] Item 1
[ ] Item 2
[ ] Item 3
[ ] Item 4
[ ] Item 5
[ ] Item 1
[ ] Item 2
[X] Item 3
[ ] Item 4
[ ] Item 5

そして、私は得る必要があります

[X] Item 1
[ ] Item 2
[X] Item 3
[ ] Item 4
[ ] Item 5

多分それは簡単なことですが、これを行う方法がわかりません。たぶん、私は2つで間違ったアプローチを取っていforeachますか?

4

2 に答える 2

1

すべてのループに書き込む代わりに、その存在をチェックし、そのステータスをチェック済みに設定します

<?php foreach ($amenities as $single) : ?>
<?php $strChecked = '';?>
    <?php foreach ($related as $amenity) : ?>

      <?php if ( $single === $amenity) : ?>
          <?php $strChecked = ' checked="checked"';break;?>

      <?php endif ?>

    <?php endforeach;?>

        <input type="checkbox" class="left" <?php echo $strChecked;?> name="amenities[]" value="<?=$amenity['itemID']?>">
        <label class="checkbox"><?=$amenity['itemName']?></label>
<?php endforeach;?>
于 2012-04-09T17:28:59.967 に答える
0

foreach使用する場合、実際には単一のループでこれを行うことができますin_array

<?php
    foreach ($amenities as $amenity) {
        $id = $amenity['itemID'];
        $name = $amenity['itemName'];
        $checked = in_array($amenity, $related) ? ' checked="checked"' : '';
        echo <<<HTML
        <input type="checkbox" class="left"$checked name="amenities[]" value="$id">
        <label class="checkbox">$name</label>
        <br>
HTML;
    }
?>

ご覧のとおり、HTML コードを読みやすくするために、$amenity['itemID']との値も変数に格納しました。$amenity['itemName']

少し複雑ですが、より柔軟なアプローチを使用することもできます。

function filter_array_to_ids ($a) {
    return $a['itemID'];
}

// Get an array that contains the id of each item in the
// $related array
$checked_ids = array_map(filter_array_to_ids, $related);

foreach ($amenities as $amenity) {
    $id = $amenity['itemID'];
    $name = $amenity['itemName'];
    $checked = in_array($id, $checked_ids) ? ' checked="checked"' : '';
    echo 'checked = ' . $checked . '<br>';
    echo 'amenity = ' ; print_r($amenity); echo '<br>';
    echo <<<HTML
    <input type="checkbox" class="left"$checked name="amenities[]" value="$id">
    <label class="checkbox">$name</label>
    <br>
HTML;
}

このコードは、配列内の項目のarray_mapのみを含む配列を作成するために使用し、その配列内で現在の設備の ID を検索します。これにより、アイテム インとアイテム インがまったく同じでなくても (追加のメンバーがある場合など)、一致する ID を見つけることができます。itemID$related$amenities$related

于 2012-04-10T01:35:16.547 に答える