我可以使用什么机制来订购阵列?

Dav*_*ger 5 php mysql sql arrays

我陷入了一个非常奇怪的问题.我的意思是我不怎么威胁这一点.

基本上,我有一个网页,我列出了定义的公交路线的所有站点(例如route_id = 141).有时,一条路线可以从A点开始,然后从理论上从一个终点到另一个终点进入B点.但是,有时候,相同的路线可以在A和B之间的某个地方开始行程并且在A点或B点行驶.

您可以在此地址查看实时工作示例:http://stm.tranzit.ca/bus/stops/85/Hochelaga/

我的超级平局:

Regular trip
Start(A) ----------------------------------- End(B)

Sometime
                 Start --------------------- End(B)
Start(A) ---------------------- End
Run Code Online (Sandbox Code Playgroud)

等等.它总是在A点和B点之间.90%的时间是从A到B,但是另外10%它可以在那里之间的任何地方,直到那里之间的另一点(有时从中间到A或B) .

好.在我使用stop_sequence对结果进行排序之前.我知道停止序列的顺序,所以停止1,停止2等等,以及多少次停止行程(行程从A到B,或从A到中间等).

现在,我找到了一种方法来通过旅行对我的结果进行排序并将它们区分开来,所以现在我知道我得到的所有旅行(AB,BA,A-middle,中B等等).

因此,如果我说我有AB,BA,A-Middle和B-Middle,我有4次可能的路线旅行.然后我获取链接到它的所有停止.

例如,这是已定义路线的行程A到B的列表.请注意stop_sequence 35的值.

1   #53014  Station Frontenac (Frontenac / Ontario)

... 2, 3. etc..

34  #53293  Honoré-Beaugrand / Roux  
35  #54257  Station Honoré-Beaugrand / Sherbrooke    
36  #53290  Saint-Donat / Sherbrooke     
37  #53265  Saint-Donat / De Forbin-Janson   
38  #54676  Saint-Donat / De Grosbois    
39  #54674  Saint-Donat / Roi-René   
40  #54672  Saint-Donat / les Reaux  
41  #54668  Saint-Donat / Chénier    
42  #54661  Joseph-Renaud / Yves-Prévost     
43  #54646  Joseph-Renaud / Châtillon    
44  #54629  Joseph-Renaud / Wilfrid-Pelletier    
45  #54605  Joseph-Renaud / Châteauneuf  
46  #54609  Châteauneuf / Vaujours   
47  #54610  Châteauneuf / Rabelais   
48  #54612  Châteauneuf / de la Loire    
49  #54621  Châteauneuf / Roi-René   
50  #54623  Châteauneuf / des Ormeaux    
51  #54639  Châteauneuf / Rondeau    
52  #54724  Rondeau / Georges    
53  #54735  Rondeau / De La Vérendrye    
54  #54738  Rhéaume / Chaumont   
55  #54740  Chaumont / Guy   
56  #54741  Chaumont / Azilda    
57  #54742  Yves-Prévost / Azilda    
58  #54659  des Ormeaux / Chaumont
Run Code Online (Sandbox Code Playgroud)

这是中间和B之间的旅行.

1   #54257  Station Honoré-Beaugrand / Sherbrooke    
2   #53290  Saint-Donat / Sherbrooke     
3   #53265  Saint-Donat / De Forbin-Janson   
4   #54676  Saint-Donat / De Grosbois    
5   #54674  Saint-Donat / Roi-René   
6   #54672  Saint-Donat / les Reaux  
7   #54668  Saint-Donat / Chénier    
8   #54661  Joseph-Renaud / Yves-Prévost     
9   #54646  Joseph-Renaud / Châtillon    
10  #54629  Joseph-Renaud / Wilfrid-Pelletier    
11  #54605  Joseph-Renaud / Châteauneuf  
12  #54609  Châteauneuf / Vaujours   
13  #54610  Châteauneuf / Rabelais   
14  #54612  Châteauneuf / de la Loire    
15  #54621  Châteauneuf / Roi-René   
16  #54623  Châteauneuf / des Ormeaux    
17  #54639  Châteauneuf / Rondeau    
18  #54724  Rondeau / Georges    
19  #54735  Rondeau / De La Vérendrye    
20  #54738  Rhéaume / Chaumont   
21  #54740  Chaumont / Guy   
22  #54741  Chaumont / Azilda    
23  #54742  Yves-Prévost / Azilda    
24  #54659  des Ormeaux / Chaumont
Run Code Online (Sandbox Code Playgroud)

现在,正如您所看到的,此处的stop_sequence 1与35相同.第二个停止与上面的停止36相同.正如您所看到的,从第35档到第58行的计数为24.与第二次行程相同.

现在,我想知道的是,我如何使用PHP合并它们?我想在第一组匹配时让我们说第二组并将其合并到第一组中,因此第二组中的stop_sequence 1将变为stop_sequence 35因为它匹配并且它是相同的.

使用这种方式,我可以保持停止顺序,而不是在订购结束时使用stop_sequence,因为如您所见,第二次行程的stop_sequence 1在第一次行程中等于24.这意味着如果我通过使用MySQL的stop_sequence命令,它将按顺序排序所有stop_sequence,因此结果将是第一次旅行的stop_sequence 1,第二次旅行的序列1等等,我的命令将是错误的所有停止将是明确的错误.

我想在PHP中这样做,但我不知道如何匹配数组中的结果并避免X结果,所以我可以完美匹配.

如果你想知道我的SQL查询是什么,这里是:

SELECT      t.trip_id, t.trip_headsign, st.stop_sequence, s.stop_id, s.stop_code, s.stop_name
FROM        trips AS t
LEFT JOIN   stop_times AS st ON st.trip_id = t.trip_id
LEFT JOIN   stops AS s ON s.stop_id = st.stop_id
WHERE       t.route_id = 141
    AND     t.trip_id IN (
        SELECT trip_id
        FROM (
            SELECT trip_id
            FROM (
                SELECT      COUNT(*) AS count, trips.trip_id, trips.trip_headsign
                FROM        trips
                LEFT JOIN   stop_times ON trips.trip_id = stop_times.trip_id
                WHERE       route_id = 141
                    AND     trips.trip_id LIKE (SELECT CONCAT(service_id, "%") FROM calendar_dates WHERE date = "20120628")
                GROUP BY    trips.trip_id
            ) a
            GROUP BY count, trip_headsign
        ) a
    )
GROUP BY    t.trip_id, st.stop_id
ORDER BY    t.trip_id ASC, st.stop_sequence ASC
Run Code Online (Sandbox Code Playgroud)

trip_id 定义它是来自AB,BA,A-middle等

stop_sequence 是定义旅行的停止顺序

stop_idstop_code共享相同的东西 - 唯一的id(一个用户,一个用于内部系统)

trip_headsign 就像141-W或141-N(西部或北部).

编辑:

根据我的查询,我可以为每次旅行都停下来(绿色和红色).我希望通过保持订单将其合并到一个列表中. 示例模式

路线可以从停止1(红色)到停止8.因此行程1可以是停止1,停止2等,直到停止8.

路线可以从1号站(绿色)到8号站.因此行程可以是1号站点,7站点站点和8号站点.

我的查询给了我两个旅行停止列表.

现在,我想将它们合并如下:

列表: - 停止1(红色) - 停止2 - 停止3 .... - 停止6 - 停止1(绿色) - 停止7(即使他在行程中红色和绿色一次) - 停止8(即使他一次是红色和绿色的旅行)

Ja͢*_*͢ck 1

总结一下评论中的内容:

  1. 通过断言第一站为 A、最后一站为 B 来查找权威行程
  2. 对于彼此的旅行:
    1. 如果第一站是 A,它将与主要行程左/上对齐
    2. 如果最后一站是 B,它将与主要行程右/下对齐

或者,您可以从较短行程的任一侧开始,并删除主行程中未出现的所有停靠点。