Rechnen mit vorgegeben Werten aus Json Datei

  • Hey,


    ich habe 3 Json Dateien in der Daten stehen. Mit diesen Daten möchte ich rechnen.
    Es gibt dort eine Start- und Ende Id und Zahlen zugewiesen zu unterschiedlichen Ids in einem Array.


    Nun möchte ich, alle Zahlen bei denen die Id zwischen der Start- und Ende Id liegt aus den 3 Dateien berechnen. Jede Datei hat natürlich ein anderes Ergebnis.


    Dazu habe ich erstmal die Json Dateien decodiert und in einem Array abgespeichert damit ich alle Daten der 3 Dateien habe. Soweit alles gut.

    Nun möchte ich eben die Zahlen berechnen und daran scheitert alles.


    Ich bekomme Zahlen raus, die ich überhaupt nicht nachvollziehen kann. Ich habe bereits viel ausprobiert und gedebugt. Aber es komme immer Zahlen raus die nicht richtig sind.


    Mich würde interessieren wie ihr da vorgehen würdert, damit ich es selbst versuchen kann. Vilt. hilft es mir.


    Die Json Dateien sind wie folgt aufgebaut:

    Im Array nach dem Decoden sieht es wie folgt aus:


    Grüße,

    Stef

  • Mein Versuch:


    Ich bekomme bei $test dies raus:

    Code
    Array
    (
        [0] => 1080
        [1] => 120
        [2] => 780
        [3] => 480
        [4] => 1380
    )

    Das 2 Ergebnis ist richtig. Alle anderen nicht. Ich habe nochmal selbst nachgezählt und bei mir kommt das selbe raus.

    Nur das Problem ist, dass das Formular welches die Werte prüft nur das 2. Ergebnis als richtig erkennt. Auch meine selbst ausgerechneten Ergebnisse bis auf das 2.te werden als falsch gesehen.


    Verstehe ich nicht.

  • Ich glaube, das solltest du kennen:


    Richtig debuggen


    1. Man bemerkt, dass ein Skript nicht das tut, was es soll.
    2. Man schreibt an den Anfang des Scriptes die Zeile: error_reporting(-1);
    3. Man verwendet ini_set('display_errors', true); damit die Fehler auch angezeigt werden.
    4. Man versucht, die Stelle die daran Schuld sein kann, schonmal einzugrenzen. Falls dies nicht geht, wird zunächst das komplette Skript als fehlerhaft angesehen.
    5. An markanten Stellen im Skript lässt man sich wichtige Variableninhalte ausgeben und ggf. auch in bedingten Anweisungen eine kurze Ausgabe machen, um zu überprüfen, welche Bedingung ausgeführt wurde. Wichtig bei MySQL Fehlern (...not a valid MySQL result resource...): mysqli_error() verwenden oder Abfrage ausgeben und zb mit phpmyadmin testen.
    6. Schritt 5 wird so lange wiederholt, bis Unstimmigkeiten im Skript auffallen
    7. Damit hat man das Problem (Unstimmigkeit) gefunden und kann versuchen diese zu beheben. Hierzu dienen dann die PHP-Dokumentation und andere Quellen als Ratgeber.
    8. Lässt sich das konkrete Problem trotzdem nicht beheben, kann man in Foren um Rat fragen.
    9. Das Programm läuft und man kann die Debug-Ausgaben wieder entfernen.
  • Hey,


    das ganze habe ich schon mehrmals heute durchlaufen (ca. 2 Stunden). Es werden keine Fehler angezeigt und ich sehe da keinen Fehler.

    Wie gesagt: Auch beim nachrechnen kommen die gleichen Werte raus. Warum ist es dann in diesem Formular falsch?


    Entweder es ist die Aufgabenstellung fehlerhaft beschrieben oder es fehlt was in den Json Dateien.


    Denn die Aufgabenstellung erfülle ich mit meinem Script.

  • Ich habe nun mal alle notwendigen Dateien in ein Zip gelegt. In der line.php steht oben die Aufgabenstellung.


    Würde mich sehr interessieren ob ihr auch auf die gleichen Ergebnisse kommt wie ich.

  • Verstehe die Aufgabenstellung nicht ganz: Es sollen Fahrzeiten berechnet werden. Es gibt fünf JSON-Dateien; Repräsentieren die jeweils eine Linie eines Verkehrsmittels? In jeder JSON-Datei steht Start- und Zielstation. Sollte kein Problem sein, die Fahrzeit zwischen diesen Stationen zu berechnen. Sollen dann die Fahrzeiten auf den einzelnen Linien zu eine Gesamtfahrzeit addiert werden? Mir würde es das Verständnis erleichtern, wenn ich wüsste, was das im realen Leben bedeutet: Verkehrsmittel wie Straßenbahn oder U-Bahn wie ich es oben vermutet habe?

  • Moin,


    Genau. Es gibt fünf Json Dateien. Jede Json Datei repräsentiert eine Linie. Die Linie ist in den Json Dateien mit der startStation und endStation festgelegt. Es soll nun die Fahrzeit (in Sekunden) erfasst werden wie lange die Straßenbahn\der Zug braucht um diese Linie zu fahren.


    Grüße,

    Stef

  • Guten Morgen Stef,

    so etwas war früher mein Beruf ;)

    Ich habe das mal ein wenig anders aufgezogen: Für jede Linie ein Objekt kreiert. Habe nicht nachgerechnet, aber grob erscheinen mir die Ergebnisse plausibel. In das mit der Session-Variablen bin ich nicht weiter eingestiegen.

  • Hey Sempervivum,


    okay. Interessant :)


    Ein interessanter Ansatz.


    Würdest du extra für nur 1ne Berechnungsfunktion eine neue Klasse erstellen? Meiner Ansicht nach ist die Fahrzeit eine Eigenschaft der Linie ist und sollte daher auch in der Klasse "Linie" berechnet werden.


    Da kommt das gleiche raus wie bei meiner Rechnung. Sehr komisch. Muss mal nachfragen.


    Grüße,

    Stef

  • Zitat

    Meiner Ansicht nach ist die Fahrzeit eine Eigenschaft der Linie ist und sollte daher auch in der Klasse "Linie" berechnet werden.

    Für genau die Linie wird sie auch in den Linienobjekten berechnet. Ich weiß nicht genau, wie die Aufgabenstellung ist, hatte angenommen, dass eine Gesamtfahrzeit ermittelt werden soll. Wenn nur die linienspezifische gefragt ist, kann man auf den Calculator wahrscheinlich verzichten.

  • Aso okay.


    Ich habe mir nochmals alles genauer angeschaut aufgrund den fehlerhaften Werten. Ich habe glaube ich den Grund herausgefunden warum mir falsche Werte ausgegeben werden. Der Grund ist, dass in den Json Files die Ids mal hochgezählt und mal runtergezählt werden.


    Kann dies denn sein? Sonst fällt mir keiner mehr ein.


    Beispiel:



    Was meint ihr?


    Stef

  • input22.json kommt mir fragwürdig vor: Ich verstehe das so, dass die Fahrzeit immer von der aktuellen Station (die in id steht) bis zur nächsten gerechnet wird. Dann würde man in der Endstation keine brauchen, wohl aber in der Startstation. In input22.json ist es jedoch genau umgekehrt.

    Außerdem sehe ich noch ein anderes Problem, das durchdacht werden müsste: Normaler Weise können die Züge in beiden Richtung fahren, d. h. die Stationen sowohl in aufsteigender als auch in absteigender Reihenfolge durchfahren. Allerdings für die aktuelle Aufgabenstellung wohl nicht relevant, den die ID der Startstation ist jeweils kleiner als die der Zielstation.

  • Ich habe gerade eine Rückmeldung erhalten.


    Die falschen Ergebnisse liegen an der falschen Vorgehensweise des Berechnens. Man muss bei der Berechnung auf die Primär- und Sekundärrichtung der Fahrtrichtung (Ids) achten.


    Ich habe jetzt mein Script dahingehend angepasst. Ich überprüfe ob die Ids hoch- oder heruntergezählt werden und lege daran die Berechnung in der for-Schleife fest. Aber da kommen immernoch fehlerhafte Ergebnisse raus.


    Folgende 3 richtige Ergebnisse wurden mir auch mitgegeben:

    Json 21: 1140 Sekunden

    Json 22: 120 Sekunden

    Json 23: 840 Sekunden


    Bei mir kommt dies raus:


    json21: 1080 Sekunden

    json22: 120 Sekunden

    json23: 780 Sekunden

    json24: 480 Sekunden

    json25: 1380 Sekunden


    Also was ganz falsches.


    Ich füge nochmals alle notwendigen Dateien als Zip als Anhang hinzu (die Aufgabenstellung ist dabei).


    Würde mich echt freuen wenn wir den Fehler beheben könnten. Ich weiß nicht wie ich auf diese richtige Ergebnisse kommen soll und was an dem Script falsch ist.


    Mein jetztges Script sieht so aus:

    Grüße,

    Stef

  • input22.json kommt mir fragwürdig vor: Ich verstehe das so, dass die Fahrzeit immer von der aktuellen Station (die in id steht) bis zur nächsten gerechnet wird. Dann würde man in der Endstation keine brauchen, wohl aber in der Startstation. In input22.json ist es jedoch genau umgekehrt.

    Außerdem sehe ich noch ein anderes Problem, das durchdacht werden müsste: Normaler Weise können die Züge in beiden Richtung fahren, d. h. die Stationen sowohl in aufsteigender als auch in absteigender Reihenfolge durchfahren. Allerdings für die aktuelle Aufgabenstellung wohl nicht relevant, den die ID der Startstation ist jeweils kleiner als die der Zielstation.

    Hey,


    ja. Mir zu aller erst auch. Jetzt habe ich es etwas besser verstanden.


    In der input22.json fährt der Zug in die Sekundärrichtung. Das heißt von oben nach unten. 1553 ist dann die Startstation und 1551 die Endstation sogesehen. Darum kommt da 120 raus.


    Doch die Fahrtrichtung ist sehr relevant bei dieser Aufgabe, siehe meinen vorigen Beitrag dazu.

    • input21.json : 1080
    • input22.json : 120
    • input23.json : 780
    • input24.json : 480
    • input25.json : 1380

    Wenn ich nachrechne, stimmt das auch...


    Folgende 3 richtige Ergebnisse wurden mir auch mitgegeben:

    Json 21: 1140 Sekunden

    Json 22: 120 Sekunden

    Json 23: 840 Sekunden

    Gibt es dazu auch eine Erklärung? Denn wenn ich mir die json21 ansehe, habe ich Start und Ende zwischen 1807 und 1820. Also kommen nur diese Stationen in Frage:

    verkürzt dargestellt:

    d.h.:

    4 x 60 = 240

    7 x 120 = 840


    in Summe: 240 + 840 = 1080


    Wo sollen denn die restlichen 60 zu 1140 her kommen?

    Lt. Aufgabenstellung, wie von Dir geschrieben, ist 1080 der richtige Wert.


    Aus meiner Sicht dürfte noch nicht mal die Endstation berücksichtigt werden, denn durationToNext besagt für mich, die Dauer zur nächsten Haltestelle, die es aber bei der Endstation gar nicht gibt. Berücksichtigt man diese Logik, kommen wieder ganz andere Werte raus, allerdings geringere, so dass man sich noch weiter von den angeblich korrekten Werten entfernt, anstatt sich zu nähern.


    Entweder stimmt etwas an der Aufgabenstellung respektive den Dateien nicht, oder die vorgegebenen Ergebnisse sind schlicht falsch.


    In der input22.json fährt der Zug in die Sekundärrichtung. Das heißt von oben nach unten. 1553 ist dann die Startstation und 1551 die Endstation sogesehen.

    Das stimmt z.B. nicht oder ist falsch dargestellt in der Datei, denn dort steht:

    Code
    "startStation": 1551,
    "endStation": 1553

    und heißt somit, dass an Station 1551 gestartet wird und an 1553 endet!

    Nicht umgekehrt.

  • Hey Arne,


    danke für deine Antwort.


    Auf die gleichen Ergebnisse und Feststellungen kam ich auch. Ich kann dir nicht sagen woher die anderen Werte kommen sollen. Dies ist für mich auch unklar.


    Zitat

    Gibt es dazu auch eine Erklärung?

    Nein. Gibt es keine. Mir wurden nur die Tipps mitgegeben, dass ich auf die Fahrtrichtung achten soll und mir nochmal die Aufgabenstellung sowie die Json Dateien anschauen soll.


    Nochmal zurückkommend auf die Fahrtrichtung. Es gibt bei dieser Aufgabe die Primärrichtung und Sekundärrichtung.


    Diese sind wie folgt definiert:


    #1 → #2 → #3 → Primärrichtung (geht von unten nach oben)

    #3 → #2 → #1 → Sekundärrichtung (geht von oben nach unten)


    Dann gehe ich davon aus, dass bei den Json-Dateien in denen die Id heruntergezählt wird die Sekundärrichtung und nicht die Primärrichtung vorliegt. Nach dieser Sekundärrichtung habe ich mein Script auch verändert. Ich überprüfe ja jetzt ob die Id hoch oder runtergezählt wird und lege anhand diesem Faktor die Berechnung der Fahrtzeit fest. Nur da kommt das gleiche raus wie vor der Berücksichtigung der jeweiligen Richtungen. Ist auch verständlich weil es da nicht mehr Werten gibt.


    Stef

  • Dann gehe ich davon aus, dass bei den Json-Dateien in denen die Id heruntergezählt wird die Sekundärrichtung und nicht die Primärrichtung vorliegt.

    Das kannst Du aber an den Dateien gar nicht fest machen, schau Dir mal die json25 bspw. an ( Auszug ):

    Von oben nach unten gelesen, also was Du als Fahrtrichtung bezeichnest, müsste er beamen können:

    • 1723
    • 1107
    • 1609
    • 1726
    • 1727
    • 1804
    • 1729

    Wie will man da eine Fahrtrichtung festlegen?!

Jetzt mitmachen!

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