Bạn đã không hiển thị trong cả hai câu hỏi của mình bảng cơ sở dữ liệu là gì, vì vậy tôi không thể trả lời cụ thể nó, nhưng sẽ phác thảo gợi ý của tôi.
Bạn có thể sử dụng các chức năng tổng hợp trong mysql để có được các mục tin tức của bạn được sắp xếp và nhóm theo chủ đề bao gồm. số lượng của họ. Bạn có thể thực hiện hai truy vấn để có được số lượng trước, điều đó phụ thuộc một chút vào cách bạn muốn xử lý dữ liệu của mình.
Trong mọi trường hợp, sử dụng mysql_...
các chức năng, tất cả dữ liệu bạn đã chọn từ cơ sở dữ liệu sẽ nằm trong bộ nhớ (thậm chí gấp đôi do nội bộ). Vì vậy, có một mảng khác như trong câu hỏi trước của bạn sẽ không ảnh hưởng nhiều đến việc tối ưu hóa copy on write trong PHP. Chỉ một chi phí nhỏ hiệu quả.
Bên cạnh đó, trước khi quan tâm đến đầu ra thực tế, bạn nên lấy dữ liệu của mình theo thứ tự để không cần kết hợp xử lý dữ liệu và logic đầu ra. Trộn lẫn làm cho mọi thứ trở nên phức tạp hơn do đó khó giải quyết hơn. Ví dụ:nếu bạn đặt đầu ra của mình vào các chức năng đơn giản, việc này sẽ dễ dàng hơn:
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>';
}
Điều này đã giải quyết được vấn đề đầu ra của bạn, vì vậy chúng tôi không cần quan tâm đến nó nữa. Chúng ta chỉ cần quan tâm đến những gì sẽ đưa vào các hàm này dưới dạng tham số.
Chủ đề X cho mỗi biến thể cột:
Với biến thể này, dữ liệu phải là một mảng với một chủ đề cho mỗi giá trị, giống như bạn đã làm với câu hỏi trước. Tôi sẽ nói rằng nó đã được giải quyết. Không biết bạn gặp vấn đề cụ thể nào với số lượng cột, tính toán có vẻ ổn, vì vậy tôi bỏ qua cho đến khi bạn cung cấp thông tin cụ thể về nó. "Không hoạt động" không đủ điều kiện.
Các mục tin tức X trên mỗi biến thể cột:
Điều này là thú vị hơn. Một động thái dễ dàng ở đây là tiếp tục chủ đề trước đó với cột tiếp theo bằng cách thêm lại tiêu đề chủ đề. Một cái gì đó như:
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
Để đạt được điều này, bạn cần xử lý dữ liệu của mình hơi khác một chút, cụ thể là theo số lượng mục (tin tức).
Giả sử bạn quản lý để truy xuất dữ liệu được nhóm (và do đó được sắp xếp) từ cơ sở dữ liệu của mình:
SELECT TopicName, NewsID FROM news GROUP BY 1;
Sau đó, bạn có thể chỉ cần lặp lại tất cả các hàng được trả về và tạo các cột của mình, cuối cùng xuất ra chúng (đã được giải quyết):
$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);
}
Vì vậy, điều này thực sự có thể so sánh với câu trả lời trước đó, nhưng lần này bạn không cần phải sắp xếp lại mảng để có được tin tức được sắp xếp theo chủ đề của chúng vì truy vấn cơ sở dữ liệu đã thực hiện điều này (bạn cũng có thể làm điều đó cho câu trả lời trước đó ).
Sau đó, nó lại giống nhau:Lặp lại tập kết quả được trả về và đưa dữ liệu vào một cấu trúc mà bạn có thể xuất ra. Đầu vào, Xử lý, Đầu ra. Nó luôn luôn như vậy.
Hy vọng điều này sẽ hữu ích.