将数组连接到一个关联数组

时间:2019-07-10 17:13:11

标签: php csv

我在数据库的单行中的三列中保存了许多WaypointID,方位角和距离。每列都存储用逗号分隔的各个项目。

  • 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给出相应的方位角和航点。

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

3 个答案:

答案 0 :(得分:1)

为回答您的问题,只要waypointsIds是唯一的,下面的代码将起作用。就像其他人提到的那样,该良性表示修复数据库布局。您在这里拥有的东西可能会真正受益于单独的表。

<?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);

答案 1 :(得分:1)

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

我不认为通过使用explode在PHP中提取信息来解决此问题,.. etc是正确的方法,因此,我将阐明如何规范数据库:

当前,您有一个这样的表(可能有更多列):

主表: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 :(得分:0)

$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);