J'ai ce problème, je pense que vous pouvez m'aider.
PS Je ne sais pas comment appeler cela, donc si quelqu'un trouve un titre plus approprié, veuillez le modifier.
Contexte
- Je fais cette application pour rechercher des lignes de transport en commun.
- Les lignes de bus sont à 3 chiffres et sont uniques et ne changeront jamais.
- Il faut pouvoir rechercher des lignes de l'arrêt A à l'arrêt B.
- L'interface utilisateur réussit déjà à suggérer à l'utilisateur de n'utiliser que des noms d'arrêt valides.
- La condition est de pouvoir afficher si un itinéraire a une ligne directe, et sinon, afficher une combinaison de 2 lignes et même de 3 lignes.
Exemple:
Je dois aller du point A au point D. Le programme devrait montrer:
- S'il y a une ligne directe AD.
- Si ce n'est pas le cas, affichez d'autres combinaisons de 2 lignes, telles que AC, CD.
- S'il n'y a pas de combos 2 lignes, recherchez les combos 3 lignes: AB, BC, CD.
Bien sûr, l'application doit afficher les numéros de ligne de bus, ainsi que le moment de changer de bus.
Ce que j'ai:
Ma base de données est structurée comme suit (simplifiée, la base de données réelle comprend les lieux et les heures et ainsi de suite):
+-----------+
| bus_stops |
+----+------+
| id | name |
+----+------+
+-------------------------------+
| lines_stops_relationship |
+-------------+---------+-------+
| bus_line | stop_id | order |
+-------------+---------+-------+
Où lines_stops_relationship
décrivez une relation plusieurs-à-plusieurs entre les lignes de bus et les arrêts.
Ordre, signifie l'ordre dans lequel les arrêts apparaissent sur une seule ligne. Pas toutes les lignes vont et viennent, et l'ordre a un sens (le point A avec l'ordre 2 vient après le point B avec l'ordre 1).
Le problème
- Nous découvrons si une ligne peut traverser l'itinéraire assez facilement. Recherchez simplement une seule ligne qui passe par les deux points dans le bon ordre.
- Comment puis-je trouver s'il y a un combo 2/3 lignes? Je pensais à rechercher une ligne qui correspond à l'arrêt source, et une pour l'arrêt de destination, et voir si je peux obtenir un arrêt commun entre eux, où l'utilisateur peut changer de bus. Comment puis-je me souvenir de cet arrêt?
- Le combo de 3 lignes est encore plus délicat, je trouve une ligne pour la source et une ligne pour la destination, et puis quoi? Recherchez une ligne qui a 2 arrêts, je suppose, mais encore une fois, comment puis-je me souvenir des arrêts?
tl; dr
Comment puis-je me souvenir des résultats d'une requête pour pouvoir les réutiliser? J'espère y parvenir en une seule requête (pour chacun, une requête pour les itinéraires à 1 ligne, une requête pour 2 et une requête pour les combos à 3 lignes).
Remarque: cela ne me dérange pas si quelqu'un suggère une approche complètement différente de la mienne, je suis ouvert à toutes les solutions.
Accordera toute assistance avec un cookie et un vote positif. Merci d'avance!
Réponses:
Vous ne voudrez peut-être pas apporter cette modification drastique à ce stade, mais ce que vous décrivez est exactement le cas d'utilisation des bases de données graphiques . Les bases de données graphiques sont basées sur la théorie des graphes, c'est ce que vous touchez en essayant de trouver un chemin entre 'X' et 'Y' à travers un graphique dirigé des itinéraires de bus.
Si vous n'en avez pas déjà examiné un, jetez un œil à quelque chose comme Neo4J . Il a une API REST et vous pouvez trouver des clients PHP pour cela.
Vous trouverez un tas de personnes de Stack Overflow qui pourraient vous aider avec la mise en œuvre des choses.
la source
Disons qu'un utilisateur veut aller de
$start_id
à$end_id
(les deux sont des valeurs stop_id valides). Vous pouvez utiliser ces requêtes pour trouver un itinéraire valide de$start_id
à$end_id
:Recherche d'itinéraire direct (ligne unique):
S'il n'y a aucun résultat avec la requête précédente, alors recherchez un itinéraire en utilisant 2 lignes:
Remplacez-les
*
par les champs que vous devez vraiment récupérer.la source
bus_stops bs5
) pour terminer l'itinéraire?