Funkcja przeszukująca stringa

0

Witam serdecznie,
Mam taki blok danych:

E|2014-10-26 04:00:00|usa|Chopin|<finish>
C|26-10-2014 04:00:01|26-10-2014 05:00:00|2|1||dzisiaj|FULL||usa|Chopin|<finish>
F|26-10-2014 04:00:01|usa|Chopin|<finish>
D|26-10-2014 05:00:01|26-10-2014 15:00:00|1|2||dzisiaj|FULL||usa|Chopin|<finish>
C|26-10-2014 15:00:01|26-10-2014 16:00:00|1|2||dzisiaj|FULL||usa|Chopin|<finish>
D|26-10-2014 16:00:01|27-10-2014 02:00:00|2|1||jutro|FULL||usa|Chopin|<finish> 

Na przykładzie drugiego wiersza: C|26-10-2014 0401|26-10-2014 0500|2|1||dzisiaj|FULL||usa|Chopin|<finish>
Oznacza że pojazd będzie poruszał się w godzinach od 26-10-2014 0401 do 26-10-2014 0500

Na przykładzie czwartego wiersza: D|26-10-2014 0501|26-10-2014 1500|1|2||dzisiaj|FULL||usa|Chopin|<finish>
Oznacza że pojazd będzie się poruszał od 26-10-2014 0501 do 26-10-2014 1500.

Wiesz E|2014-10-26 0400|usa|Chopin|<finish> - oznacza że pojazd stoi.

Potrzebuję funkcję która przeszuka powyższego stringa i wyszuka blok danych najbliższego wskazanej dacie.
Czyli np. szukam daty 26-10-2014 0501 - to zwróci mi blok: C|26-10-2014 1501|26-10-2014 1600|1|2||dzisiaj|FULL||usa|Chopin|<finish>

Wie ktoś może jak coś takiego rozwiązać?

Bardzo proszę o pomoc,
Northwest

0

Najbliżej której daty, tej drugiej? Czyli stojące pojazdy nie mają być brane pod uwagę? Nieważne zresztą, datediff w php pewnie się jakieś znajdzie, potem szukasz najmniejszej wartości wśród tych wszystkich "datediffów".

0

Jeżeli szukasz najbliżej podanej dacie, to nie wystarczy przeszukiwanie stringów. Musisz sparsować sobie te daty i porównywać. Odrzucić wszystkie, które są mniejsze i wziąć najmniejszą większą/równą tej podanej. Przyda Ci się na pewno funkcja explode()

0
<?php
namespace NortWest;

date_default_timezone_set('UTC');

class Parser {

    /**
     *
     * @var resource 
     */
    public $file;

    /**
     * 
     * @param string $file
     */
    public function __construct($file) {
        $this->file = fopen($file, "r");
    }

    /**
     * 
     * @param \DateTime $dateTime
     * @return string|null
     */
    public function findConnection(\DateTime $dateTime) {
        $timeStamp = $dateTime->format("U");
        $resultLine = null;
        rewind($this->file);
        $minTime = null;
        while (!feof($this->file)) {
            $line = fgets($this->file);
            $time = $this->checkRow($line, $timeStamp);
            if($time < 0){
                continue;
            }
            if(is_null($minTime)){
                $minTime = $time;
            }
            
            if($time <= $minTime){
                $resultLine = $line;
                $minTime = $time;
            }
        }
        return $resultLine;
    }

    /**
     * 
     * @param string $row
     * @param \DateTime $dateTime
     * @return int
     */
    protected function checkRow($row, $dateTime) {
        if (empty($row)) {
            return -1;
        }

        list(, $a, $b) = explode("|", $row);
        try {
            $startDate = new \DateTime($a);
            $startDate = $startDate->format("U");
            $endDate = new \DateTime($b);
            $endDate = $endDate->format("U");
        } catch (\Exception $e) {
            return -1;
        }
        
        if($dateTime <= $endDate && $dateTime >= $startDate){
            return 0;
        }
        
        if($dateTime > $startDate){
            return -1;
        }
        
        return $startDate - $dateTime;
    }

    /**
     * 
     */
    public function __destruct() {
        fclose($this->file);
    }

}



/**
 * Example usage
 */

$parser = new Parser("db.txt");
$line = $parser->findConnection(new \DateTime("26-10-2014 05:00:01"));

var_dump($line); //result should be string(82) "D|26-10-2014 05:00:01|26-10-2014 15:00:00|1|2||dzisiaj|FULL||usa|Chopin| "

0

dziękuję bardzoooo :) ale niestety nie do końca to działa jak bym chciał :(

Potrzebuję w z tego bloku znaków:
E|2014-10-26 0400|usa|Chopin|<finish>
C|26-10-2014 0401|26-10-2014 0500|2|1||dzisiaj|FULL||usa|Chopin|<finish>
F|26-10-2014 0401|usa|Chopin|<finish>
D|26-10-2014 0501|26-10-2014 1500|1|2||dzisiaj|FULL||usa|Chopin|<finish>
C|26-10-2014 1501|26-10-2014 1600|1|2||dzisiaj|FULL||usa|Chopin|<finish>
D|26-10-2014 1601|27-10-2014 0200|2|1||jutro|FULL||usa|Chopin|<finish>

Na przykładzie drugiego wiersza: C|26-10-2014 0401|26-10-2014 0500|2|1||dzisiaj|FULL||usa|Chopin|<finish>
Oznacza że pojazd będzie poruszał się w godzinach od 26-10-2014 0401 do 26-10-2014 0500
Na przykładzie czwartego wiersza: D|26-10-2014 0501|26-10-2014 1500|1|2||dzisiaj|FULL||usa|Chopin|<finish>
Oznacza że pojazd będzie się poruszał od 26-10-2014 0501 do 26-10-2014 1500.
Wiesz E|2014-10-26 0400|usa|Chopin|<finish> - oznacza że pojazd stoi.

Bloki poprzedzone E lub F (np. E|2014-10-26 0400|usa|Chopin|) - oznaczają że pojazd zaczął przejazd - i koniec przejazdu nastąpił dzisiaj (na przykładowej linijce o 2014-10-26 0400).
Czyli teoretycznie można założyć że data startu to 0000 wybranego dnia (czyli dla E|2014-10-26 0400|usa|Chopin| a końca przejazdu to ta, podana po "E/f" - czyli taki wiersz wyglądałby następująco: E|2014-10-26 0000|2014-10-26 0400|usa|Chopin|)

Generalnie potrzebuję 2 informację na podstawie wpisanej daty i godziny czy:

  1. pojazd jest zajęty (informacja: tak/nie + zwracamy całą ramkę)
  2. kiedy był ostatni przejazd (czyli szukamy w przeszłości - od wybranej daty i godziny) - tylko 1 wynik i zwracamy całą ramkę

Jako ramka rozumiem ten ciąg: E|2014-10-26 0000|2014-10-26 0400|usa|Chopin|

Nie wiem, ale chyba teraz jaśniej to rozpisałem?

Bardzo proszę i dziękuję za pomoc,
Northwest :)

0

a w czym konkretniej masz problem? Co cie blokuje, by zrobić te zadanie?

0

Witam ponownie,
Udało mi się dostosować skrypt do moich potrzeb :) Mam tylko problem z podmianką tego wczytywania danych. Chciałbym żeby to wczytywało dane ze zmiennej $danedobadania - a nie z pliku. Mógłby ktoś mi to zmienić? To jest napisane obiektowo, a ja bardziej strukturalnie programuje.... nie wiem jak to zmienić :(

Dziękuje bardzo za pomoc :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1