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)
Su consulta le ofrece múltiples viajes para esa ruta, ¿verdad? ¿Y desea "alinear" los viajes más cortos con los más largos? –
@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. –
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? –