Rechnen mit vorgegeben Werten aus Json Datei

  • Ok, wenn man mal nicht stur nach den Zahlen geht, kommt das tatsächlich hin. Gemeint sind alle Stationen zwischen Start und Ende, ganz egal, in welchem Bereich die id liegt:

  • Hey Arne,


    vielen Dank! :)


    Ich habe versucht selbst eine Lösung zu finden aber kam nicht darauf wie ich den Schlüssel der Start- und Endstation bestimmen kann. Habe dann deinen recht einfachen Code dafür verwendet.


    Zum Verständnis:


    $iStartIndex = array_keys( array_filter($jData->stations, function($j) use ($iStart) { return $j->id == $iStart; }) )[0];:


    Die Funktion array_keys() erfasst alle vorhandenen Schlüssel des Arrays. In dieser rufst du die Funktion array_filter() auf. Dieser gibst du das Array Stations mit. Über dieses wird dann in der Callback-Funktion iteriert. Nun legst du eine anonyme Funktion fest in der der erste mitgegebene Parameter ($j) das Array Stations repräsentiert und $iStart die Startstation. Und mit [0] sagte du dass von diesem Ergebnis das 1ste Element des return Arrays genommen werden soll. In diesem Array steht an erster Stelle dann der passende Schlüssel.


    $bIsForward = $iStartIndex < $iEndIndex;


    Hier legst du die Fahrtrichtung fest. In diesem Fall bei TRUE die Primärrichtung und bei FALSE die Sekundärrichtung.


    $iOffset = abs( $iEndIndex - $iStartIndex );


    Frage: Warum verwendest du denn dort die Funktion abs() ?


    $aStations = array_slice( $jData->stations, ($bIsForward ? $iStartIndex : $iEndIndex), $iOffset );


    Hier rufst du die Funktion array_slice auf und übergibst ihr das Array Stations welches extrahiert werden muss, die jeweilige Richtung und die Anzahl der Elemente welche im Array bleiben müssen.


    Habe ich dies so richtig verstanden?


    Grüße,

    Stef

  • Die Funktion array_keys() erfasst alle vorhandenen Schlüssel des Arrays. In dieser rufst du die Funktion array_filter() auf. Dieser gibst du das Array Stations mit. Über dieses wird dann in der Callback-Funktion iteriert. Nun legst du eine anonyme Funktion fest in der der erste mitgegebene Parameter ($j) das Array Stations repräsentiert und $iStart die Startstation. Und mit [0] sagte du dass von diesem Ergebnis das 1ste Element des return Arrays genommen werden soll. In diesem Array steht an erster Stelle dann der passende Schlüssel.

    Ich glaube, Du meinst das richtige. Ich habe da jetzt einfach zwei array-Funktionen zusammengeworfen, normaler Weise kann man die auch in zwei Zeilen schreiben, damit es übersichtlicher wird. Ich mache das aber oft so, wenn ich ein Resultat einer Funktion nur zur einmaligen Wiederverwendung benötige.


    Verschachtelte Funktionen musst Du von innen nach außen lesen. Die Funktion array_filter() hat eine spezielle Funktion, sie gibt alle Elemente des übergebenen Array zurück, die in der Callback-Function ein true erzeugen, d.h., alle Elemente, die false erzeugen werden gefiltert ( sozusagen entfernt ).

    Ich übergeben also alle $jData->stations und erhalte nur die Elemente, die der Start-Station entsprechen. Um das zu prüfen, übergebe ich der Callback-Funtion einfach mit use ( $iStart ) die ID der Start-Station.


    D.h., nach array_filter() habe ich am Ende ein Array mit nur einem Element, von dem ich wissen muss, unter welchem Index/Key der in $jData->stations steht.

    Das gleiche mache ich mit der End-Station, so habe ich dann die Array-Schlüssel beider Stationen.


    Frage: Warum verwendest du denn dort die Funktion abs() ?

    Weil ich für array_slice() in $iOffset die positive Differenz benötige. Bei einem negativem Wert von $iOffset erhalte ich evtl. falsche Ergebnisse, bzw. nicht erwartete.


    Mit array_slice() extrahiere ich Elemente aus einem Array, hier aus $jData-Stations. Der erste Parameter gibt an, ab welchem Schlüssel im Array extrahiert werden soll. Hier prüfe ich über die ternäre Operation, ob ich mich in Primär- oder Sekundärrichtung bewege und setze den Startwert zum Extrahieren entsprechend auf $iStartIndex oder $iEndIndex.

    Der zweite Parameter von array_slice() gibt an, wie viele Elemente extrahiert werden sollen, hier benötige ich $iOffset als positive Zahl, daher abs().


    Im Prinzip relativ leicht, wir haben am Anfang nur alle den Fehler gemacht, die Start- und Endstation als Minimal- bzw. Maximalwert zu betrachten und haben deshalb einige Stationen nicht berücksichtigt.


    Gruß Arne

Jetzt mitmachen!

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