Перебирайте наборы записей (PHP + MySQL), группируя каждые 2 записи в элементе списка - PullRequest
0 голосов
/ 13 января 2012


Мне нужно перебрать набор записей (PHP + MySQL), сгруппировав каждые 2 записи в элемент списка

Мой фактический код (в упрощенном виде) такой:

<?php
// how many total records do I have?
mysql_select_db($database_connEIB, $connEIB);
$query_rsMediaCount = "SELECT COUNT(*) AS med_count FROM media";
$rsMediaCount = mysql_query($query_rsMediaCount, $connEIB) or die(mysql_error());
$row_rsMediaCount = mysql_fetch_assoc($rsMediaCount);

$mCount = $row_rsMediaCount['med_count']; // total records
$mPages = ceil($mCount / 2); // max LIs to create
$mIndex = 0; // useful initialization for LIMIT, see below

if ($mCount > 0) { // let's show markup only if there's some record!
?>
    <ul>
    <?php for ($mPage = 1; $mPage <= $mPages; $mPage++) { // create the LIs ?>
        <li>
        <?php
        $query_rsMedia = "SELECT med_id FROM media LIMIT $mIndex, 2";
        $rsMedia = mysql_query($query_rsMedia, $connEIB) or die(mysql_error());
        $row_rsMedia = mysql_fetch_assoc($rsMedia);
        do { ?>
            <div><?php echo $row_rsMedia['med_id']; ?></div>
        <?php } while ($row_rsMedia = mysql_fetch_assoc($rsMedia));
        $mIndex += 2; // increment the LIMIT by 2 steps ?>
        </li>
    <?php } ?>
    </ul>
<?php } ?>

Вывод сортируется так:

<ul>
    <li>
        <div>1</div>
        <div>2</div>
    </li>
    <li>
        <div>3</div>
        <div>4</div>
    </li>
    <li>
        <div>5</div>
    </li>
</ul>

Все работает, но есть ли более элегантное или эффективное решение? Заранее спасибо

Ответы [ 4 ]

1 голос
/ 13 января 2012

Я бы попытался выполнить меньше запросов.

$query_rsMedia = "SELECT med_id FROM media";
$rsMedia = mysql_query($query_rsMedia, $connEIB) or die(mysql_error());
$count = 0;

echo '<ul>';

while($row = mysql_fetch_assoc($rsMedia))
{
   //check divisibility to know when to show li
   if ($count % 2 == 0) {
      echo '<li>';          
   } 

   echo '<div>' . $row['med_id'] . '</div>';
   $count++;

   if ($count % 2 == 0) {
      echo '</li>';          
   }
}
if ($count % 2 == 1) echo '</li>';
echo '</ul>';
1 голос
/ 13 января 2012

Выполните только один запрос и сгруппируйте результаты в цикле. Используйте оператор по модулю %:

$query_rsMedia = "SELECT med_id FROM media";
$rsMedia = mysql_query($query_rsMedia, $connEIB) or die(mysql_error());

if (mysql_num_rows($rsMedia) > 0) { // check if there is at least one result
    echo '<ul>';
    $index = 0;
    while ($row_rsMedia = mysql_fetch_assoc($rsMedia)) {
        if ($index % 2 == 0) echo '<li>'; // open <li> bevore even result
        echo '<div>'.$row_rsMedia['med_id'].'</div>';
        if ($index % 2 == 1) echo '</li>'; // close <li> after odd result
        $index++;
    }
    if ($index % 2 == 1) echo '</li>'; // close <li> if odd result count
    echo '</ul>';
}

(только что написано, а не тест)

0 голосов
/ 13 января 2012

Сначала я бы разделил HTML и PHP для удобства чтения.Кроме того, я не совсем убежден в цикле do ... while, который на самом деле печатает результат (что, если таблица пуста?).

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

Поэтому может выглядеть так:

<ul>
    <?php generateList(); ?>
</ul>


<?php
function getPageCount() {
    mysql_select_db($database_connEIB, $connEIB);
    $query_rsMediaCount = "SELECT COUNT(*) AS med_count FROM media";
    $rsMediaCount = mysql_query($query_rsMediaCount, $connEIB) or die(mysql_error());
    $row_rsMediaCount = mysql_fetch_assoc($rsMediaCount);

    $mCount = $row_rsMediaCount['med_count']; 
    $mPages = ceil($mCount / 2); 
}

function generateList() 
    $mIndex = 0; 
    $mPages = getPageCount();

    if ($mCount > 0) {
        for ($mPage = 1; $mPage <= $mPages; $mPage++) { 
            $result = "<li>" ;
            $query_rsMedia = "SELECT med_id FROM media LIMIT $mIndex, 2";
            $rsMedia = mysql_query($query_rsMedia, $connEIB) or die(mysql_error());
            $row_rsMedia = mysql_fetch_assoc($rsMedia);
            while ((row_rsMedia = mysql_fetch_assoc($rsMedia)) != null) {
                $result .= "<div>".$row_rsMedia['med_id']."</div>";
            }
            $mIndex += 2;
            $result .= "</li>
        }

        echo $result;
    }
?>

Надеюсь, это поможет.

0 голосов
/ 13 января 2012

Задайте запрос один раз без оператора LIMIT. Затем сделайте что-то вроде этого:

$iteration=0;
echo '<li><ul>';
while ($row_rsMedia = mysql_fetch_assoc($rsMedia)
{
    echo '<div>'.$row_rsMedia['med_id'].'</div>';
    $iteration++;
    if ($iteration%2==0 && $iteration<$mCount)
        echo '</ul><ul>'
}
echo '</ul><li>';
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...