Loop orderby Ergebnis einer Funktionsberechnung

  • Hallo zusammen,
    ich habe ein relativ anspruchsvolles Problem, wie ich glaube. Ich habe meine Posts um Latitude- und Longitude-Koordinaten erweitert, diese werden in der Datenbank gespeichert. Nun nutze ich folgende Funtkion (herzlichen Dank an Tobias Leuschner), um die Distanz gegebener Koordinaten zum entsprechenden Post zu berechnen:

    Das funktioniert alles soweit auch ganz gut, alle Posts werden mit Distanz-Angabe in km angezeigt.

    PHP
    <?php $distance = distance($user_lat, $user_lng, $location['lat'], $location['lng']); echo $distance; ?>

    Jetzt würde ich gerne alle Posts in der Reihenfolge der Distanz ausgeben.

    Ich denke mal dafür müsste ich den Loop erst einmal durchlaufen lassen, um die Distanz zu ermitteln und ein zweites Mal, um die Distanz irgendwie als orderby Variable nutzen zu können - falls das überhaupt geht. Oder sieht jemand noch eine andere, einfache Möglichkeit? Ich bin für alle Hinweise dankbar.

    Grüße,
    Uwe

    • Anzeige

    Hallo!

    Wenn du gerade an deiner Website arbeitest oder dein aktuelles Hosting überdenkst: Wir betreiben mit NetzLiving eine Hosting-Plattform, die speziell auf Performance, Sicherheit und einfache Verwaltung ausgelegt ist.

    • ✔️ Schnelle Ladezeiten (optimiert für WordPress & Co.)
    • ✔️ Deutsche Server & DSGVO-konform
    • ✔️ Persönlicher Support (kein 0815-Ticket-System)

    Mehr erfahren

  • So gesehen schon richtig, da the_loop jeden Post einzeln ausgibt (bzw. dessen Daten).
    Daher wäre es schlauer, ein eigenes SQL-Query zu schreiben, was nur Post-ID, Latitude und Longitude wiedergibt, damit die Daten in PHP schnell eingelesen werden können.
    Allerdings muss dann jedes mal die Entfernung zu jedem anderen Beitrag berechnet werden - was bei vielen Seitenaufrufen auch entsprechende Last verursachen könnte.

    Man kann auch die Posts nach Latitude/Longitude sortiert von MySQL wiedergeben lassen, nach der ID des aktuellen Postings suchen und dann die Posts filtern, die am wenigsten Differenz von Lat/Long haben.

    Wenn ein Post also 50°0'0'' / 40°0'0'' hat, soll SQL nur Post mit 40° bis 60° / 30° bis 50° ausgeben. Für die paar Posts lohnt es sich dann, die genaue Entfernung zu berechnet, um genau danach sortieren zu können.

    Viel Spaß, das in PHP-Code und MySQL-Queries zu übersetzen :-D

  • Da die Distanz keine Metainformation des Posts ist und somit erst bei der Ausgabe berechnet werden kann, bleibt nur der Weg mit foreach durch das Resultset / die Query zu laufen, die Entfernung zu berechnen und dem Array hinzuzufügen. Nun kann nach dem Arraykey sortiert werden und die Ausgabe erfolgen. Alternativ könnte man bereits in einem eigenen SQL Query die Entfernung berechnen und anschließend durch das sortierte Resultset loopen.

    WordPress ist "frei" wie in Freiheit es zu nutzen, aber nicht im Sinne von Freibier. Wer also glaubt man bekommt rund um WordPress alles kostenlos, der irrt. Hilfe ist ein Geschenk für das man sich bedankt, dafür gibt es den 'Gefällt mir' Button. Wer das nicht kann und sich selbst nicht zu helfen weiss, muss sich bezahlte Unterstützung suchen.

  • Das liest sich so, als wäre es so kompliziert wie befürchtet.. wenn ich den Loop mit foreach ausgebe, scheint folgender Filter nicht mehr zu funktionieren, der für die Bestimmung des Radius der Umkreissuche verwendet wird:

    Gäbe es vielleicht die Möglichkeit die Distanz ebenfalls per Filter für die Sortierung nutzbar zu machen?

  • Hallo nochmal,
    ich habe folgenden Hinweis gefunden, weiß jedoch nicht wie ich das umsetzen kann und ob es das Problem lösen würde: http://stackoverflow.com/questions/2758…s-it-with-mysql

    Bevor ich versuche herauszufinden wie man das umsetzt, wäre es möglich die Funktion "function location_posts_where( $where )" auf diese Weise so anzupassen, dass die Posts in der Reihenfolge der Distanz im Loop ausgegeben werden?


  • ich habe folgenden Hinweis gefunden, weiß jedoch nicht wie ich das umsetzen kann und ob es das Problem lösen würde: http://stackoverflow.com/questions/2758…s-it-with-mysql

    Das entspricht der von mir bereits genannten Möglichkeit das direkt in SQL Query zu erledigen.


    Bevor ich versuche herauszufinden wie man das umsetzt, wäre es möglich die Funktion "function location_posts_where( $where )" auf diese Weise so anzupassen, dass die Posts in der Reihenfolge der Distanz im Loop ausgegeben werden?

    Ich sehe keinen Grund warum das nicht gehen sollte. Dazu muss man eben nur die gesamte Programmierung kennen, also alle Funktionen und wie diese ineinander greifen. Für mich persönlich sprengt das aber den Rahmen der Hilfe im Forum.

    WordPress ist "frei" wie in Freiheit es zu nutzen, aber nicht im Sinne von Freibier. Wer also glaubt man bekommt rund um WordPress alles kostenlos, der irrt. Hilfe ist ein Geschenk für das man sich bedankt, dafür gibt es den 'Gefällt mir' Button. Wer das nicht kann und sich selbst nicht zu helfen weiss, muss sich bezahlte Unterstützung suchen.

  • Du bist dir absolut Sicher, dass du für jeden Seitenaufruf die Entfernung aller angezeigten Artikel zu jedem anderen existierenden Artikel vom MySQL-Server berechnen lassen willst?
    Für mich wäre es da doch eleganter, die Werte einmal zu berechnen und dann in einem Extra-Feld zu speichern, was bei bedarf abgefragt und geparst werden kann. Allerdings müssen dann die Daten immer aktuell gehalten werden, also bei jedem neuen Eintrag der hinzugefügt wird, muss bei jedem Eintrag die Distanz zu diesem Artikel hinzugefügt werden.

    Ungeachtet dessen, wieviel die einzelnen Operationen kosten:
    Im Query kommen 4 Multiplikationen und 12 Funktionsaufrufe (sin,cos usw.), 2 Additionen und 1 Wertabfrage vor.

    Und diese Operationen werden für jedes Element in der Datenbank ausgeführt! Bei 100 Posts in der DB und 5 Angezeigten sind das also 9500 Operationen.

    Wenn man nur Lat/Long vergleicht, müssen genau 2 Wertabfragen für jeden Eintrag in der DB getätigt werden, also 1000 Operationen (100 Einträge 5 angezeigte Artikel).
    Je nachdem wie die Toleranz in den Wertabfragen gewählt ist, kommen mehr oder weniger Eintrage als Ergebnis raus. Daher ist die Gesamtanzahl von Operationen für den Sortiervorgang nicht berechenbar, aber unter 9500 liegt sie auf jeden Fall, wenn die Toleranz nicht alle anderen Posts einbezieht.

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!