Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/76.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从MySQL填充的PHP多维数组_Php_Html_Mysql_Multidimensional Array_Html Table - Fatal编程技术网

从MySQL填充的PHP多维数组

从MySQL填充的PHP多维数组,php,html,mysql,multidimensional-array,html-table,Php,Html,Mysql,Multidimensional Array,Html Table,我正在创建一个假期报告工具来帮助我跟踪我的远程工作人员,也以此为借口,因为我正在学习将代码作为一种爱好 我需要在表格中创建每个人的假期摘要(顶部是个人日期,下面是姓名),但我遇到了问题,需要一些帮助 我有两个表,一个表包含用户详细信息,另一个表存储使用userid绑定在一起的假日记录。我只记录这段时间的开始和结束日期,我很难理解如何将所需的信息放入多维数组中以构建HTML表 我确信它使用的是一个for-each循环,但我无法理解,有人能帮忙吗?MySQL: 如果您的日期是时间戳或日期时间,则可以

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

我需要在表格中创建每个人的假期摘要(顶部是个人日期,下面是姓名),但我遇到了问题,需要一些帮助

我有两个表,一个表包含用户详细信息,另一个表存储使用userid绑定在一起的假日记录。我只记录这段时间的开始和结束日期,我很难理解如何将所需的信息放入多维数组中以构建HTML表

我确信它使用的是一个for-each循环,但我无法理解,有人能帮忙吗?

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
$days = array();
foreach ($rows as $row)
{
  $days[$row['bday']] = explode(",", $row['nickname']);
}
var_dump($days);
您将获得每个不同日期的一行,并且所有用户的生日都用逗号(
)分隔

有关此请求的一些注意事项:

  • 子字符串(birthdays.your_date_field,6,5)
    :如果您的
    your_date_field
    是日期时间或时间戳,它将包含一个日期,格式为
    YYYY-MM-DD hh:MM:ss
    ,因此我们需要剪切此字符串以获得
    MM-DD
    格式

  • GROUP\u CONCAT(users.昵称)
    表示如果多行进入同一组,则列将使用逗号(
    )连接,而不是仅使用进入组的第一行

  • groupby
    将使用一列对结果进行分组,以便将所有在同一天过生日的用户分组在一起。如果要在单个请求中对列的不同值进行计算(例如计数、求和等),这也很有用

例如:

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)
演示:


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);
现在,如果您想要数组数组而不是逗号分隔的值,您可以使用它们(当然,如果昵称不包含逗号)

比如:

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
$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"
  }
}

我想你得到了一切,祝你的实现好运。

Plz,提供表的结构:用户详细信息和假期记录。把你的问题分成几个小问题:因为人们不想花太多时间为你写整个应用程序。