Вложенный foreach-l oop работает только один раз на PDO - PullRequest
0 голосов
/ 11 марта 2020

Это фрагмент моего кода:

<?php 
$kategorien = $kategorieQuery
$items = $itemQuery
foreach($kategorien as $kategorie): ?>
    <div class="list">
        <h1><?php echo $kategorie['kategorie']; ?></h1>
        <?php if(!empty($items)): ?>
        <ul>
            <?php foreach($items as $item):
                if($kategorie['kategorie'] == $item['kategorie']): ?>
                    <li class="todo"><?php echo $item['kategorie']; ?></li>
                <?php endif; ?>   
            <?php endforeach; ?>
        </ul>
        <?php else: ?>
            <p>No todos</p>
        <?php endif; ?>
    </div>
<?php endforeach; ?>

Переменные выглядят так (print_r):

$kategorie:  [kategorie] => test [0] => test
$item: Array ( [id] => 4 [0] => 4 [name] => name [1] => name [done] => 0 [2] => 0 [kategorie] => test [3] => test ) 1

Моя проблема в том, что внешний foreach l oop работает, но внутренний работает только один раз. Таким образом, он повторяет все имена элементов, где kategor ie равен текущему kategor ie, но все последующие моменты времени просто не выводятся, но $ items не пуст в любое время. Чего мне не хватает?

1 Ответ

2 голосов
/ 11 марта 2020

Ваш код, как указано, отлично работает :

<?php

$kategorien = [
    ["kategorie" => "test"],
    ["kategorie" => "sample"],
];
$items = [
    ["id" => 1, "name" => "item1", "done" => 0, "kategorie" => "test"],
    ["id" => 2, "name" => "item2", "done" => 0, "kategorie" => "test"],
    ["id" => 3, "name" => "item3", "done" => 0, "kategorie" => "sample"],
    ["id" => 4, "name" => "item4", "done" => 0, "kategorie" => "test"],
    ["id" => 5, "name" => "item5", "done" => 0, "kategorie" => "sample"],
];
?>

<?php foreach($kategorien as $kategorie): ?>

<div class="list">
    <h1><?= $kategorie['kategorie'] ?></h1>
    <?php if(!empty($items)): ?>
    <ul>
        <?php foreach($items as $item): ?>
            <?php if($kategorie['kategorie'] == $item['kategorie']): ?>
        <li class="todo"><?= $item['name'] ?></li>
            <?php endif ?>
        <?php endforeach ?>
    </ul>
    <?php else: ?>
        <p>No todos</p>
    <?php endif; ?>
</div>
<?php endforeach; ?>

Но в комментариях мы узнали, что $items не массив, а объект оператора. Так что вам нужно сделать это:

<?php
require_once 'app/init.php';
$itemsQuery = $db->prepare("SELECT id, name, done, kategorie FROM todo WHERE user_id = :user_id");
$itemsQuery->execute(['user_id'=>$_SESSION['user_id']]);
$items = $itemsQuery->fetchAll(\PDO::FETCH_ASSOC);

И аналогично вашему списку категорий. Выполнение fetchAll() сохраняет результаты в массиве, который можно циклически повторять столько раз, сколько вам нужно.

Набор результатов базы данных имеет внутренний счетчик; как только вы достигли конца результирующего набора, вы больше не можете l oop над ним, в отличие от массива.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...