Mysql
 sql >> база данни >  >> RDS >> Mysql

PHP - Вложен списък, разбит на четни колони (поправка и актуализации)

Не сте показали и в двата си въпроса какво представлява таблицата на базата данни, така че не мога конкретно да й отговоря, но ще очертая предложението си.

Можете да използвате функциите за агрегиране в mysql, за да получите вашите новини, подредени и групирани по теми, вкл. техния брой. Можете да направите две заявки, за да получите първо броя, това зависи донякъде как искате да работите с данните си.

Във всеки случай, с помощта на mysql_... функции, всички данни, които сте избрали от базата данни, ще бъдат в паметта (дори два пъти поради вътрешни). Така че наличието на друг масив, както в предишния ви въпрос, не би трябвало да навреди много, благодарение на копирането при оптимизация на запис в PHP. Ефективно само малко режийни разходи.

Освен това, преди да се погрижите за действителния изход, трябва да подредите данните си, така че да не е необходимо да смесвате обработката на данни и изходната логика. Смесването прави нещата по-сложни и следователно по-трудни за решаване. Например, ако поставите изхода си в прости функции, това става по-лесно:

function render_list($title, array $entries)
{
    echo '<ul><li>', $title, '<ul>';
    foreach($entries as $entry)
    {
        echo '<li>', $entry['NewsID'], '</li>';
    }
    echo '</ul></li></ul>;
}

function render_column(array $topics)
{
    echo '<div class="column">';
    foreach($topics as $topic)
    {
        render_list($topic['title'], $topic['entries']);
    }
    echo '</div>';
}

Това вече решава проблема ви с изхода, така че няма нужда да се интересуваме повече от него. Просто трябва да се грижим какво да зададем на тези функции като параметри.

X теми за вариант на колона:

При този вариант данните трябва да са масив с една тема на стойност, както направихте с предишния въпрос. Бих казал, че вече е решено. Не знам кой конкретен проблем имате с броя на колоните, изчислението изглежда добре, така че го пропускам, докато не предоставите конкретна информация за него. „Не работи“ не отговаря на условията.

X новинарски елементи за вариант на колона:

Това е по-интересно. Лесен ход тук е да продължите предишната тема със следващата колона, като добавите отново заглавието на темата. Нещо като:

Topic A    Topic A    Topic B
 - A-1      - A-5      - B-4
 - A-2     Topic B     - B-5
 - A-3      - B-1      - B-6
 - A-4      - B-2
            - B-3

За да постигнете това, трябва да обработвате данните си малко по-различно, а именно по брой елементи (новини).

Да приемем, че сте успели да извлечете данните, групирани (и следователно сортирани) от вашата база данни:

SELECT TopicName, NewsID FROM news GROUP BY 1;

След това можете просто да повторите всички върнати редове и да създадете своите колони, накрая да ги изведете (вече решено):

$itemsPerColumn = 4;

// get columns
$topics = array();
$items = 0;
$lastTopic = NULL;

foreach ($rows as $row)
{
    if ($lastTopic != $row['TopicName'])
    {
        $topic = array('title' => $row['TopicName']);
        $topics[] = &$topic;
    }
    $topic['entries'][] = $row;

    $items++;
    if ($items === $itemsPerColumn)
    {
        $columns[] = $topics;
        $topics = array();
        $lastTopic = NULL;
    }
}

// output
foreach($columns as $column)
{
    render_column($column);
}

Така че това всъщност е сравнимо с предишния отговор, но този път не е необходимо да пренареждате масива, за да получите новините, подредени по тяхната тема, защото заявката за база данни вече прави това (можете да направите това и за предишния отговор ).

След това отново е същото:Итерация върху върнатия набор от резултати и привеждане на данните в структура, която можете да изведете. Вход, обработка, изход. Винаги е едно и също.

Надявам се това да е полезно.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Коя е най-добрата практика за съхраняване на персонализирани данни за Wordpress

  2. SQL_CALC_FOUND_ROWS / FOUND_ROWS() не работи в PHP

  3. Как да форматирам число с . като разделител на хиляда и , като десетичен разделител?

  4. Поле за дата и час на Django - преобразувайте в часова зона в изглед

  5. Мога ли да извърша транзакция в две MySQL бази данни?