[PHP] vind dichtbijzijnde sleutel in array

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Olla,

probleempje waar ik zo snel geen oplossing voor weet. Ongetwijfeld dat hier echter knappe koppen rondlopen die het antwoord wel kennen.

Via een PHP script lees ik gegevens uit van TomTomWork met STOP data. Dus momenten waarop een voertuig heeft stilgestaan. Vanuit een ander systeem heb ik tank gegevens met de datum en tijdstip waarop een tankbeurt is afgerekend.

Wat ik wil is om de odometer (KMteller) uit te lezen van het moment dat het dichtsbij het tankmoment ligt. Ik beperkt de data set al door alleen die gegevens uit te lezen vanaf een uur voor de tankbeurt tot een uur na de tankbeurt. Helaas lopen niet alle systemen namelijk op dezelfde klok en zit er in de tijd dus een afwijking in, soms een flinke van meer dan een kwartier.

Bij de onderstaande data weet ik dat er om "16/10/2007 08:48" afgerekend is bij de bezine pomp. Ik zou dus Array[1] terug willen krijgen met als odometer stand 31690000.

Hoe is dit alleen in een PHP script te schrijven dat op een juiste manier de dichtsbijzijnde waarde van de end_time vind?

Alvast bedankt,
Bas van Ginkel

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
Array
(
    [0] => Array
        (
            [objectno] => 056
            [objectname] => XXXXXXXXXX.
            [start_time] => 16/10/2007 07:10:42
            [end_time] => 16/10/2007 08:35:49
            [odometer] => 31685300
        )

    [1] => Array
        (
            [objectno] => 056
            [objectname] => XXXXXXXXXX.
            [start_time] => 16/10/2007 08:43:12
            [end_time] => 16/10/2007 08:49:49
            [odometer] => 31690000
        )

    [2] => Array
        (
            [objectno] => 056
            [objectname] => XXXXXXXXX.
            [start_time] => 16/10/2007 08:59:20
            [end_time] => 16/10/2007 09:10:45
            [odometer] => 31701500
        )

)

Acties:
  • 0 Henk 'm!

  • GlowMouse
  • Registratie: November 2002
  • Niet online
Zorg dat je alle tijdstippen in unix timestamps krijgt. Daarna hoef je alleen nog maar door de array te lopen en de odometerstand bij de kleinste waarde van abs(betaaltijdstip - end_time) te vinden.

Acties:
  • 0 Henk 'm!

  • frickY
  • Registratie: Juli 2001
  • Laatst online: 18-09 14:42
Maak een loopje. Bereken per key het verschil in tijd. Break je loopje als je bij het kleinste verschil bent.

Iets als
PHP:
1
2
3
4
5
6
7
8
9
10
11
$vorigVerschil = false;
$gezochteTijd = strtotime('16/10/2007 08:48');
foreach($stopbeurten as $key => $val) {
   $verschil = abs($gezochteTijd - strtotime($val['end_time']));
   if(!$vorigVerschil || $verschil < $vorigVerschil) {
      $vorigVerschil = $verschil;
   } elseif($verschil > $vorigVerschil) {
      // Het vorige puntr was dichterbij dan het ooit nog zal worden
      return $vorigVerschil;
   }
}

Acties:
  • 0 Henk 'm!

  • Jaap-Jan
  • Registratie: Februari 2001
  • Laatst online: 17:19
Omzetten naar UNIX timestamp. Voor elk item in de array
PHP:
1
abs(end_time - gewenste_tijd)
doen en kijken of dit getal kleiner is dan zijn voorganger. Zo ja, dan is hij dichterbij, zo nee, ga door naar het volgende item in de array.

| Last.fm | "Mr Bent liked counting. You could trust numbers, except perhaps for pi, but he was working on that in his spare time and it was bound to give in sooner or later." -Terry Pratchett


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Heb ik recentelijk nog gezegd dat jullie geweldig zijn? _/-\o_

Hartelijk dank voor deze verhelderende commentaren. Soms zit je zo dicht met je ogen op de bomen dat je het bos niet meer kan zien. ;)

Mijn dank is groot.