循环遍历数组,对结果进行分组,日期与视觉上分离的 div 块相同



我得到了$users var(2d array(。$users中的每个数组如下所示:

Name | Username | BirthDay

并被过滤为"按出生日订购"。

我需要以以下格式输出用户:

------ January 15, 2017 -------
Jerry Brown
Angel Keaton
------ January 25, 2017 -------
Kelly Jones
Derrick Wang
Kate Bosch
...

这意味着具有相同出生日期的用户被分组在一个"括号"中,并用日期分隔符分隔(------ 2017 年 1 月 15 日 -------(。每个"括号"中的用户数量每次可能不同。

我目前可以实现的输出:

------ January 15, 2017 -------
Jerry Brown
------ January 15, 2017 -------
Angel Keaton
------ January 25, 2017 -------
Kelly Jones
------ January 25, 2017 -------
Derrick Wang

或其他不相关的结果,这不是完全需要的。感谢您的任何建议!

在我看来,在这样的组中呈现查询数据的一种巧妙方法是在从查询结果中获取行时创建分组数据结构。您目前的做法可能是这样的

while ($row = $result->fetch_assoc()) {
$users[] = $row;
}

这将使您获得当前拥有的平面阵列。

如果您使用日期作为键将结果提取到多维数组中,那么数据将更容易像您尝试的那样分组显示。

while ($row = $result->fetch_assoc()) {
$users[$row['birthday']][] = $row;
}

这将得到一个这样的数组:

$users = [
'January 15, 2017' => [
['name' => 'Jerry Brown', 'birthday' => 'January 15, 2017'],
['name' => 'Angel Keaton', 'birthday' => 'January 15, 2017'],
],
'January 25, 2017' => [
['name' => 'Kelly Jones', 'birthday' => 'January 25, 2017'],
['name' => 'Derrick Wang', 'birthday' => 'January 25, 2017'],
['name' => 'Kate Bosch', 'birthday' => 'January 25, 2017'],
]
];

您可以使用嵌套循环轻松迭代,以所需的格式输出。

foreach ($users as $date => $people) {
echo "<div>------ $date ------<br>";
foreach ($people as $person) {
echo "$person[name]<br>";
}
echo "</div>";
}

将最后一个日期保存在变量中并检查下一次迭代,如果日期更改,请关闭div 并创建一个新日期。

示例,它完全生成您想要的输出:

$previous = NULL;
$first = true;
echo '<div class="birthday-users">' . PHP_EOL;
foreach ($users as $user) {
$timestamp = strtotime($user["birthday"]);
$headline = date("F d, Y", $timestamp);
if ($previous !== $headline) {
if (!$first) {
echo '</div>' . PHP_EOL . '<div class="birthday-users">' . PHP_EOL;
}
echo '<h1>------ ' . $headline . ' -------</h1>' . PHP_EOL;
$previous = $headline;
if ($first) {
$first = false;
}
}
echo '<p>' . $user["name"] . '</p>' . PHP_EOL;
}
echo '</div>';

最新更新