【问题标题】:PHP multidimensional arrays populated from MySQL从 MySQL 填充的 PHP 多维数组
【发布时间】:2012-11-13 04:46:35
【问题描述】:

我正在创建一个假期报告工具来帮助我跟踪我的远程工作人员,同时也以此为借口,因为我正在学习编码作为一种爱好。

我需要在表格中创建每个人的假期摘要(个人日期在顶部,名字在侧面)但我卡住了,需要一些帮助。

我有两个表,一个包含用户详细信息,另一个存储使用用户 ID 捆绑在一起的假期记录。我只记录该期间的开始和结束日期,并且正在努力理解如何将所需的信息放入多维数组中以从中构建 HTML 表。

我确定它使用了 for each 循环,但我无法理解它,任何人都可以帮忙吗?

【问题讨论】:

  • 请提供表结构:用户详情和假期记录。并将您的问题拆分为更小的问题:因为人们不想花太多时间为您编写整个应用程序。

标签: php html mysql multidimensional-array html-table


【解决方案1】:

MySQL:

如果您的日期是时间戳或日期时间,您可以使用类似:

SELECT SUBSTRING(birthdays.your_date_field, 6, 5) AS bday, GROUP_CONCAT(users.nickname)
FROM birthdays
JOIN users USING (user_id)
GROUP BY SUBSTRING(birthdays.your_date_field, 6, 5)
ORDER BY bday ASC

您将获得每个不同日期的一行,并且所有用户的生日都用逗号分隔 (,)。

关于此请求的一些说明:

  • SUBSTRING(birthdays.your_date_field, 6, 5) : 如果你的your_date_field 是日期时间或时间戳,它会包含YYYY-MM-DD hh:mm:ss 格式的日期,所以我们需要剪切这个字符串得到MM-DD 格式。

  • GROUP_CONCAT(users.nickname)表示如果多行进入同一个组,列将使用逗号(,)连接,而不是只使用进入组的第一个。

    李>
  • GROUP BY 将使用一列对您的结果进行分组,以便将同一天生日的所有用户分组在一起。如果您想在单个请求中对列的不同值进行计算(例如 COUNT、SUM、...),这也很有用。

例子:

CREATE TABLE users (
  id int,
  nickname varchar(32)
);

insert into users ( id , nickname )
values ( 1, 'mike' ), ( 2, 'jack' ), ( 3, 'santa' ), (4, 'mario');

CREATE TABLE birthdays (
  id int,
  birthday datetime
);

insert into birthdays ( id , birthday )
values ( 1, '1982-01-01' ), ( 2, '1983-03-11' ), ( 3, '1984-01-01' ), ( 4, '2011-06-04' );

结果:

mysql> SELECT SUBSTRING(birthdays.birthday, 6, 5) AS bday, GROUP_CONCAT(users.nickname)
    -> FROM birthdays
    -> JOIN users USING (id)
    -> GROUP BY SUBSTRING(birthdays.birthday, 6, 5)
    -> ORDER BY bday ASC;
+-------+------------------------------+
| bday  | GROUP_CONCAT(users.nickname) |
+-------+------------------------------+
| 01-01 | mike,santa                   |
| 03-11 | jack                         |
| 06-04 | mario                        |
+-------+------------------------------+
3 rows in set (0.00 sec)

演示:click here


PHP:

获得这些结果的 PHP 实现可能是:

$dbh = new PDO("mysql:host=localhost;dbname=your_base", 'username', 'password');

$request = <<< EOT
  SELECT SUBSTRING(birthdays.birthday, 6, 5) AS bday, GROUP_CONCAT(users.nickname) AS nickname
  FROM birthdays
  JOIN users USING (id)
  GROUP BY SUBSTRING(birthdays.birthday, 6, 5)
  ORDER BY bday ASC;
EOT;

$rows = $dbh->query($request)->fetchAll(PDO::FETCH_ASSOC);

var_dump($rows);

会给你:

array(3) {
  [0]=>
  array(2) {
    ["bday"]=>
    string(5) "01-01"
    ["nickname"]=>
    string(10) "mike,santa"
  }
  [1]=>
  array(2) {
    ["bday"]=>
    string(5) "03-11"
    ["nickname"]=>
    string(4) "jack"
  }
  [2]=>
  array(2) {
    ["bday"]=>
    string(5) "06-04"
    ["nickname"]=>
    string(5) "mario"
  }
}

现在,如果您想要数组数组而不是逗号分隔值,您可以explode 它们(当然,如果昵称不包含逗号)。

类似:

$days = array();
foreach ($rows as $row)
{
  $days[$row['bday']] = explode(",", $row['nickname']);
}
var_dump($days);

给你:

array(3) {
  ["01-01"]=>
  array(2) {
    [0]=>
    string(4) "mike"
    [1]=>
    string(5) "santa"
  }
  ["03-11"]=>
  array(1) {
    [0]=>
    string(4) "jack"
  }
  ["06-04"]=>
  array(1) {
    [0]=>
    string(5) "mario"
  }
}

我认为你得到了一切,祝你实施顺利。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-06-25
    • 1970-01-01
    • 2016-10-04
    • 2012-09-10
    • 2017-01-25
    • 2012-11-20
    • 2011-01-11
    相关资源
    最近更新 更多