【问题标题】:Join arrays into one associative array将数组连接成一个关联数组
【发布时间】:2019-07-10 17:13:11
【问题描述】:

我在我的数据库的一行中的三列中保存了许多航点 ID、方位和距离。每列存储其各自的项目,用逗号分隔。

  • WaypointIds:510,511,512
  • 轴承:65,50,32
  • 距离:74,19,14

我想我可能把自己编码到了一个角落!我现在需要将它们从数据库中提取出来,然后将它们添加到表中以输出到屏幕上。

我正在使用以下内容将相应的列放回数组中,但我有点不知道该去哪里,或者这是否是解决问题的方法。

$waypointArrays = explode (",", $waypointsString);
$bearingArrays = explode (",", $bearingsString);

$waypointsString & $bearingsStrings 是我的数据库调用设置的变量。

我想我需要将它们全部加在一起,这样我就可以依次遍历每一个。

例如,waypointId 510,方位角为 065,距离为 0.74。

我想我需要一个关联数组,但不知道如何将它们全部添加在一起,这样我就可以遍历每个航路点 ID 并提取其余条目。

例如为每个waypointId 给出相应的方位和航点。

我已经进行了检查,以确保在我们添加航点/方位/距离时,它们不会彼此不同步,因此每列中的条目数量始终相同。

【问题讨论】:

  • Array_merge versus + 的可能重复项可能会阅读,如果仍然卡住,请向我们展示您尝试过的内容。再读一遍听起来就像只需要使用 for 循环?三个数组中的每一个的元素数相同吗?
  • 你的数据结构一开始就错了。你应该把属于一起的东西放在一起,避免你必须在不同的数组中查看相同的索引才能找到真正属于一起的东西。研究数据库规范化以修复您的数据库设计。
  • 我建议在代码库变得更加复杂之前修复它,这会导致更多问题

标签: php csv


【解决方案1】:

不要继续这种设计:您的数据库未标准化,因此您无法从数据库提供的功能中获得任何好处。

我不认为通过使用explode、..etc 提取 PHP 中的信息来解决这个问题是正确的方法,所以我将阐明您的数据库应该如何标准化:

目前你有一个这样的表(可能有更多列):

主表:route

+----+---------+-------------+----------+-----------+
| id | Name    | WaypointIds | Bearings | Distances |
+----+---------+-------------+----------+-----------+
|  1 | myroute | 510,511,512 | 65,50,32 | 74,19,14  |
| .. |   ....  |    ....     |   ....   |   ....    |
+----+---------+-------------+----------+-----------+

逗号分隔的列表违反了first normal norm:

当且仅当每个属性的域仅包含原子(不可分割)值,并且每个属性的值仅包含来自该域的单个值时,关系才处于第一范式。

您应该通过为这三列中的每一列创建一个单独的表来解决此问题,其中每个原子值都有一条记录

主表:route

+----+---------+
| id | Name    |
+----+---------+
|  1 | myroute |
| .. |   ....  |
+----+---------+

新表route_waypoint

+----------+-------------+------------+----------+
| route_id | waypoint_id | bearing_id | distance |
+----------+-------------+------------+----------+
|     1    |    510      |    65      |    74    |
|     1    |    511      |    50      |    19    |
|     1    |    512      |    32      |    14    |
|     2    |    ...      |    ..      |    ..    |
|    ..    |    ...      |    ..      |    ..    |
+----------+-------------+------------+----------+

第一列是引用主表id的外键。

要选择您需要的数据,您可以使用这样的 SQL:

select     route.*, rw.waypoint_id, rw.bearing_id, rw.distance
from       route
inner join route_waypoints rw on rw.route_id = route.id
order by   route.id, rw.waypoint_id

现在 PHP 将接收属于同一记录的三元组(航点、方位、距离)。您可能需要一个嵌套循环,而 route.id 保持不变,但这就是它的完成方式。

【讨论】:

  • 现在就这样;刚刚把纸和垫子拿出来把它弄好。
【解决方案2】:

为了回答您的问题,只要 waypointsId 是唯一的,下面的代码就可以工作。正如其他人提到的那样,这就是说,修复您的数据库布局。您在这里拥有的东西可以真正受益于单独的表格。

<?php
$waypointIds = [510, 511, 512];
$bearings = [65, 50, 32];
$distances = [74, 19, 14];

$output = [];
for ($i = 0; $i < count($waypointIds); $i++) {
    $output[$waypointIds[$i]] = [
        'bearing' => $bearings[$i],
        'distance' => $distances[$i]
    ];
}

print_r($output);

【讨论】:

  • 好的,沿着规范化路线走下去,完全理解为什么并且现在需要这样做,以免变得更糟!
【解决方案3】:
$waypoints = array(510, 511, 512);
$bearings = array(65, 50, 32);
$distances = array(74, 19, 14);

for ($i = 0; $i < count($waypoints); $i++) {
    $res[] = array(
        'waypoint' => $waypoints[$i],
        'bearing' => sprintf("%03d", $bearings[$i]),
        'distance' => $distances[$i]/100
    );
}

print_r($res);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-09-20
    • 2021-11-01
    • 2012-01-07
    • 1970-01-01
    • 2016-07-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多