【问题标题】:What mechanic can I use to order an array?我可以使用什么机制来订购阵列?
【发布时间】:2012-06-30 02:45:32
【问题描述】:

我遇到了一个非常奇怪的问题。我的意思是我不怎么威胁这个。

基本上,我有一个网页,其中列出了已定义公交路线的所有站点(例如,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

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

好的。在我使用 stop_sequence 对结果进行排序之前。我知道停靠顺序的顺序,所以停靠 1、停靠 2 等以及行程中停靠的次数(行程是从 A 到 B,或 A 到中间等)。

现在,我找到了一种按行程对结果进行排序并区分它们的方法,所以现在我知道我得到的所有行程(A-B、B-A、A-middle、middle-B 等)。

因此,假设我有 A-B、B-A、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

这是中间和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

现在,如您所见,此处的 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

trip_id定义是否来自A-B、B-A、A-middle等

stop_sequence 是已定义行程的停靠顺序

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

trip_headsign 就像 141-W 或 141-N(对于西或北)。!

编辑

通过我的查询,我可以在每次旅行中都停下来(这里是绿色和红色)。 我想通过保持顺序将其合并到一个列表中。 example schema

路线可以从第 1 站(红色)到第 8 站。所以行程 1 可以是第 1 站、第 2 站等,直到第 8 站。

路线可以从第 1 站(绿色)到第 8 站。所以行程可以是第 1 站、第 7 站和第 8 站。

我的查询给了我两个行程站点的列表。

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

列表: - 停止 1(红色) - 停止 2 - 停止 3 …… - 第 6 站 - 停止 1(绿色) - 第 7 站(即使他处于红色和绿色行程中也只有一次) - 第 8 站(即使他处于红色和绿色行程中也只有一次)

【问题讨论】:

  • 您的查询为您提供了该路线的多次行程,对吗?并且您希望将较短的行程与较长的行程“对齐”?
  • @Jack 此查询将返回按行程分组的所有站点。因此,假设我有行程 A 到 B,中间到 B 和 B 到 A,每次行程都会以良好的顺序返回所有站点。如果我们用上面的例子来考虑这个查询,上面的例子返回 2 次行程(A-B 和中间到 B)。我想将 B 合并到 A 中,因为 B 匹配它的一部分。所以最后,订单被保留,我没有多个列表。只有一个列表。
  • 等等,你就不能保持最长的行程就停靠次数吗?那不总是正确的吗?
  • @Jack 我可以,但有时从中间开始到 B 的旅行(示例)可以从行程 AB 中的未知站点作为第一站开始,但第二站将在第一次行程中.假设您在 Jack / David 街乘坐公共汽车,旅行从那里开始。然后巴士去杰克/ 13e 大道和杰克/ 15e 大道。好吧,你有 3 站。假设另一趟旅程从 David / 13e avenue 开始,然后前往 Jack / 13e Avenue 并继续常规行程。我该如何处理才能在 Jack / David 之后插入 David / 13e 并合并其余部分?
  • @Jack 检查我的编辑,我添加了一个架构

标签: php mysql sql arrays


【解决方案1】:

总结一下 cmets 中所说的内容:

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

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

【讨论】:

  • 非常感谢您宝贵的时间。
  • @DavidBélanger 很高兴;很高兴我最终仍然可以解决这个问题:)
  • 是的,这并不容易。我使用 GTFS 数据库,而 Google 这样做是为了使它难以使用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-12-09
  • 2012-03-02
  • 1970-01-01
  • 1970-01-01
  • 2014-06-05
  • 2023-04-08
  • 2020-05-02
相关资源
最近更新 更多