PHP:仅选择、分组和显示具有相同键值的数组


PHP: Selecting, grouping, and showing only arrays with the same key value?

我有一个MySQL数据库,它保存着来自车辆OBD-II阅读器的日志数据。与读取器交互的应用程序收集大量(通常超过 2,000 个)数据点集。这些数据点集中的每一个在表中都有自己的行,结果如下:

+---------------+----------------------------------+---------------+----+----+-----+
| session       | id                               | time          | kd | kf | ... |
+---------------+----------------------------------+---------------+----+----+-----+
| 1420236074526 | 5cff4a3cc80b22cecb7de85266b25355 | 1420236074534 | 14 | 8  | ... |
| 1420236074526 | 5cff4a3cc80b22cecb7de85266b25355 | 1420236075476 | 17 | 8  | ... |
| 1420236074526 | 5cff4a3cc80b22cecb7de85266b25355 | 1420236075476 | 19 | 8  | ... |
| 1420236074526 | 5cff4a3cc80b22cecb7de85266b25355 | 1420236075476 | 23 | 8  | ... |
| 1420236074526 | 5cff4a3cc80b22cecb7de85266b25355 | 1420236077477 | 25 | 8  | ... |
+---------------+----------------------------------+---------------+---------+-----+

k5kf是车辆数据类型(分别为车速和环境空气温度)。

此表中有两个索引(称为raw_logs):

  • 会话映射到列sessionid
  • ID 映射到列 id

我想做的是获取所有具有相同时间戳的行(例如1420236074526),并将它们集中到一个"会话"中。这里的目标是创建一个选择列表,我可以在其中按会话查看数据。理想情况下,我会有这样的东西作为输出:

<select>
  <option>January 1, 2015 - 7:43AM</option>
  <option>January 1, 2015 - 5:15PM</option>
  <option>January 2, 2015, - 7:38AM</option>
  ...
</select>

这就是我到目前为止所拥有的(我正在使用 Medoo 来尝试简化查询):

$session = $database->query("SELECT * FROM raw_logs USE INDEX (session)");
$sessionArray = array();
foreach($session as $session){
  $s_time = $session["session"];
  $sessionArray[$s_time] = array(
    "vehicle_speed" => $session["kd"],
    "ambient_air_temp" => $session["kf"]
  );
} print_r($sessionArray);

这行得通...有点。我将会话时间作为数组获取,并使用正确的键/值对kdkf,但它似乎不想遍历整个事情。目前表中大约有 25,000 行,但它只返回了几行,并且列表似乎没有任何逻辑顺序......它将返回 1 月 8 日的两个结果,一个来自 9 日的结果,4 个来自 10 日的结果,依此类推。


选择具有相同时间戳的所有会话、对它们进行分组并创建一个仅显示给定会话数据的可选对象的最佳方法是什么?

如果不对查询进行排序,则列表可能没有任何逻辑顺序。此外,您还将覆盖session列中存在重复值的会话数据。您可能希望执行类似 $sessionArray[$s_time][] = array(... 的操作,以将每一行附加到会话 ID 下。此外,如果您遇到问题,最好将查询的结果限制在 20-100 左右,并继续按摩,直到获得所需的结果。