我在数据库的单行中的三列中保存了许多WaypointID,方位角和距离。每列都存储用逗号分隔的各个项目。
我想我可能已经把自己编码成一个角落了!现在,我需要将它们从数据库中拉出,然后将它们添加到表中以在屏幕上输出。
我正在使用以下内容将相应的列放回数组中,但是在此之后的去向有些困惑,或者即使这样做也是如此。
$waypointArrays = explode (",", $waypointsString);
$bearingArrays = explode (",", $bearingsString);
$ waypointsString和$ bearingsStrings是我的数据库调用设置的变量。
我认为我需要将它们全部加在一起,这样才能依次遍历每个对象。
例如,waypointId 510的方位角为065,距离为0.74。
我认为我需要一个关联数组,但不确定如何将它们全部添加在一起,这样我就可以遍历每个航路点ID并取出其余的条目。
例如为每个waypointId给出相应的方位角和航点。
我进行了适当的检查,以确保当我们添加航点/方位/距离时,它们不会彼此偏离,因此每列中的条目数始终相同。
答案 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);