Цикл с while и foreach в PHP - PullRequest
       8

Цикл с while и foreach в PHP

1 голос
/ 18 сентября 2010

Кажется, я не могу получить foreach для работы. Может я не правильно понимаю.

Вот мой код:

$statement = "SELECT * FROM categories ORDER BY name ASC";
$query = mysql_query($statement)

...
...

$cals = array("sports","general","other","clubs");

foreach ($cals as $value)
{
/*  echo "<h3>".$value."</h3>"; 
*/  echo "<table width='100%'>";
while ($array = mysql_fetch_array($query))
    {
        if ($array['calendar'] == $value)
        {?>
<tr>
  <td><?php echo $array['name']; ?></td>
  <td><a onclick="update_form('<?php echo $array['name']; ?>', '<?php echo $array['calendar']; ?>')" href="#">Edit</a></td>
</tr>
<?php }
    }
    echo "</table><br />Value: $value";
}

Цель этого - заставить foreach изменить оператор if. Я планировал в операторе if сказать: if ($array['calendar'] == "sports") в первый раз, if ($array['calendar'] == "general") во второй раз и так далее. Тем не менее, он показывает все таблицы (в исходном коде), но строки таблицы после первой для каждого значения массива не создаются. Например, я правильно вижу спортивную таблицу, но не вижу строк таблицы для общих, других или клубов. В этой базе данных есть записи, которые должны появиться в каждой из них. Может ли быть проблема с инструкциями while и if? Если я вручную установлю значение $ в операторе if на одно из значений в массиве, оно покажет правильные записи.

Чего мне не хватает?

Пример данных:

в базе данных MySQL -

таблица категорий. поля:

  • ID
  • имя
  • num_events
  • календарь
  • CALENDAR_URL

Все эти поля, кроме поля календаря, содержат фиктивные данные.

В настоящее время у меня там 5 записей. Каждый из них имеет разные значения календаря. Один - это спорт, один - клубы, а второй - вообще. В зависимости от того, какое значение я помещаю первым в массиве, оно показывает только одну таблицу из всех значений с любым первым значением в массиве.

Вот исходный код с получившейся страницы:

<table width='100%'><tr>
  <td>test4</td>
  <td><a onclick="update_form('test4', 'sports')" href="#">Edit</a></td>
</tr>
<tr>
  <td>test5</td>

  <td><a onclick="update_form('test5', 'sports')" href="#">Edit</a></td>
</tr>
</table><br />Value: sports<table width='100%'></table><br />Value: general<table width='100%'></table><br />Value: other<table width='100%'></table><br />Value: clubs

Ответы [ 4 ]

2 голосов
/ 18 сентября 2010

Как указали jcubic и timdev, есть пара проблем с написанным кодом. Однако алгоритм, который вы пытаетесь использовать, очень неэффективен, потому что он повторяет весь набор результатов для каждого типа календаря. Вместо этого вы можете использовать многостолбцовую сортировку в SQL, чтобы сделать это за один проход:

$query = "SELECT * FROM categories ORDER BY calendar, name";
$results = mysql_query($results)
...
...
$last_cal = '';
while ($array = mysql_fetch_assoc($query))
{
  if (!$last_cal) {
    echo '<table>';
  }
  else if ($array['calendar'] != $last_cal) {
    echo '</table>';
    echo '<table>';
  }
  ?>
   ....HTML for table row...
  <?php
  $last_cal = $array['calendar'];
}
1 голос
/ 18 сентября 2010

Во-первых, просто точка стиля.Вы можете переименовать вашу переменную $query во что-то вроде $results.Он содержит результат запроса, а не сам запрос.

Проблема в том, что вы не сбрасываете $results.После первой таблицы вы прошли через весь массив.Когда вы дойдете до конца, и больше не будет строк для повторения, mysql_fetch_assoc() вернет false.

Так попробуйте это:

foreach ($cals as $value)
{
    while ($array = mysql_fetch_array($query))
    {
        if ($array['calendar'] == $value)
        {
            ?>
            <tr>
                <td><?php echo $array['name']; ?></td>
                <td><a onclick="update_form('<?php echo $array['name']; ?>', '<?php echo $array['calendar']; ?>')" href="#">Edit</a></td>
            </tr>
            <?php
        }
    }
    echo "</table><br />Value: $value";
    mysql_data_seek($query,0); // <=== Set the resultsets internal pointer back to zero (the first record).
}

Важным битом является mysql_data_seek()со второй до последней строки.

Вы также можете прикрепить эту mysql_data_seek() прямо перед строкой while(), если хотите.Вам просто нужно убедиться, что для каждой итерации цикла foreach указатель массива сбрасывается до того, как вы нажмете while().

EDIT : s / reset / mysql_data_seek /

1 голос
/ 18 сентября 2010

Попробуйте вместо этого ...

$result = mysql_query($query);
while ($array = mysql_fetch_array($result)) {
...
}
0 голосов
/ 18 сентября 2010

mysql_fetch_array возвращает массив, проиндексированный целым числом, если вы хотите изменить массив asoc

while ($array = mysql_fetch_array($query))

к этому

while ($array = mysql_fetch_assoc($query))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...