2012-06-28 7 views
5

Estoy atrapado en un problema muy extraño. Quiero decir que no sé cómo amenazar esto.¿Qué mecánico puedo usar para ordenar una matriz?

Básicamente, obtuve una página web donde enumero todas las paradas para una ruta de autobús definida (por ejemplo, route_id = 141). En algún momento, una ruta, puede comenzar desde el punto A y pasar al punto B de forma teórica desde un extremo a otro. Pero, en algún momento, la misma ruta puede comenzar su viaje en algún punto entre A y B e ir en el punto A o B.

Se puede ver un ejemplo de trabajo en vivo en la siguiente dirección: http://stm.tranzit.ca/bus/stops/85/Hochelaga/

Mi súper sorteo:

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

Sometime 
       Start --------------------- End(B) 
Start(A) ---------------------- End 

etc. Siempre va a estar entre el punto A y B. El 90% de las veces es de A a B, pero el otro 10% puede estar en cualquier lugar hasta otro punto intermedio (alguna vez es de medio a A o B).

Ok. Antes de ordenar el resultado usando stop_sequence. Sé el orden de la secuencia de parada, así que deténgase 1, pare 2, etc. y cuántos se detienen por viaje (un viaje es de A a B, o de A a la mitad, etc.).

Ahora, encontré una manera de ordenar mi resultado por viaje y distinguirlos así que ahora sé todo el viaje que obtuve (A-B, B-A, A-medio, medio-B, etc.).

Entonces, si vamos a decir que tengo A-B, B-A, Medio y B-Medio, tengo 4 posibles viajes para una ruta. Luego busco todas las paradas vinculadas a ella.

Ejemplo, esta es una lista para el viaje A a B para una ruta definida. Tenga en cuenta el valor en 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 

Aquí es un viaje entre el centro y 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 

Ahora, como se puede ver, stop_sequence 1 aquí es el mismo que 35. La segunda parada es la lo mismo que la parada 36 anterior. Como puede ver también, el recuento de la parada 35 a la 58 es 24. Lo mismo que el segundo viaje.

Ahora, lo que quiero saber es cómo puedo fusionarlos usando PHP? Me gustaría tomar el segundo grupo aquí y fusionarlo dentro del primero en la primera ocurrencia de esa coincidencia, por lo que stop_sequence 1 del segundo grupo se convertirá en stop_sequence 35 porque coincide y es el mismo.

Usando esta forma, puedo mantener la orden de stop, no usando stop_sequence al final del pedido, porque como viste, el segundo viaje tiene stop_sequence 1 igual a 24 en el primer viaje. Significa que si ordeno por stop_sequence usando MySQL, ordenará secuencialmente todo stop_sequence así que el resultado será stop_sequence 1 desde el primer viaje, secuencia 1 desde el segundo viaje, etc. y mi orden será incorrecta de todas las paradas serán erróneas.

Quiero hacer esto en PHP, pero no sé cómo hacer coincidir el resultado en una matriz y evitar el resultado de X después para que pueda coincidir perfectamente.

Si usted quiere saber lo que es mi consulta SQL, aquí está:

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 definir si es de la A-B, B-A, A-media, etc.

stop_sequence es el orden de la parada para un viaje definido

stop_id y stop_code comparten la misma cosa - Identificación única (una para el usuario y otro para el sistema interno)

trip_headsign es como 141-W o 141-N (como para el oeste o el norte).!

EDITAR:

Con mi consulta, que puede obtener toda parada para cada viaje (verde y rojo aquí). Quiero unir esto en una lista manteniendo el orden. example schema

ruta puede ser de la parada 1 (rojo) para detener 8. Así tropezar 1 puede detener 1, parada 2, etc. hasta el tope 8.

ruta puede ser de la parada 1 (verde) para detener 8. Entonces el viaje puede detenerse 1, parar 7 y parar 8.

Mi consulta me da la lista de paradas de ambos viajes.

Ahora, yo quiero fusionarlos de la siguiente manera:

lista: - Stop 1 (rojo) - Stop 2 - Stop 3 .... - Stop 6 - Stop 1 (verde) - Stop 7 (una vez incluso si se encuentra en viaje de rojo y verde) - Stop 8 (una vez incluso si se encuentra en viaje de rojo y verde)

+0

Su consulta le ofrece múltiples viajes para esa ruta, ¿verdad? ¿Y desea "alinear" los viajes más cortos con los más largos? –

+0

@Jack Esta consulta devolverá todas las paradas agrupadas por viaje. Así que digamos que obtuve el viaje A a B, medio a B y B a A, regresará a todos en la secuencia correcta para cada viaje. Si consideramos esta consulta con el ejemplo anterior, el ejemplo anterior devuelve 2 viajes (A-B y medio a B). Me gustaría fusionar B en A PORQUE B hace coincidir una parte. Entonces, al final, el orden se mantiene y no tengo una lista múltiple. Solo una lista. –

+0

Espera, ¿no puedes simplemente mantener el viaje más largo en términos de número de paradas? ¿No sería esa siempre la correcta? –

Respuesta

1

Para resumir lo que se ha dicho en los comentarios:

  1. Encuentra el viaje autorizada mediante la afirmación de la primera parada es A y la última parada es B
  2. Para cada otro viaje:
    1. si la primera parada es A, que será a la izquierda/superior alineado con el viaje principal
    2. si la última parada es B, éstas serán derecha/inferior alineado con el viaje principal

Opcionalmente, puede empezar a ambos lados de la viaje más corto y eliminar paradas que no lo hacen aparecer en el viaje principal.

+0

Muchas gracias señor por su valioso tiempo. –

+0

@ DavidBélanger mi placer; me alegro de que todavía pudiera entender el problema al final :) –

+0

Sí, no es fácil. Utilizo la base de datos GTFS y Google hizo esto para que sea difícil trabajar con esto. –

Cuestiones relacionadas