Waarden tussen arrays checken

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Sebastiaan Janssen

Sebastiaan Janssen

13/05/2020 00:05:25
Quote Anchor link
Beste forum gebruikers,


Ik wil graag iets maken maar weet even niet waar ik moet beginnen en hoop dat jullie mij op weg kunnen helpen.
De onderstaande array heb ik gemaakt, en nu wil ik een foreach loop en hierin een if statement.
Het if statement moet kijken of variable timecode gelijk is of hoger maar kleiner dan de eerst volgende key in de array.
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
<?php
$time_code
= 2;

$times = array(
    '2' => '10:00',
    '4' => '12:00',
    '6' => '14:00',
);

?>


is timecode 2 dan echo 10:00
maar is timecode 4 of 5 dan is het 12:00

Hoe kan ik dit mogelijk maken?
Gewijzigd op 13/05/2020 00:05:58 door Sebastiaan Janssen
 
PHP hulp

PHP hulp

25/09/2020 23:39:00
 
Ozzie PHP

Ozzie PHP

13/05/2020 02:12:32
Quote Anchor link
Code (php)
PHP script in nieuw venster Selecteer het PHP script
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
31
<?php

$time_code
= 7;

$times = array(
  '2' => '10:00',
  '4' => '12:00',
  '6' => '14:00',
);


$response = false;

if (isset($times[$time_code])) {
  $response = $times[$time_code];    
}
else {
  ksort($times);
  $memory = false;
  foreach ($times as $key => $value) {
    if ($key > $time_code && $memory) {
      $response = $memory;
      break;
    }

    if ($key < $time_code) $memory = $value;  
  }

  if (!$response && $key < $time_code) $response = $memory;
}
    

echo 'Time code: ';
echo $response ? $response : 'not found';

?>
 
Thomas van den Heuvel

Thomas van den Heuvel

13/05/2020 04:39:07
Quote Anchor link
Bovenstaande code kan wellicht korter :).

Wat als $time_code groter is dan enige key?

En misschien is het verstandiger om weg te sturen van deze opzet.

Hoe ben je in eerste instantie tot dit ontwerp gekomen want dit komt redelijk apart over allemaal. Misschien wat meer achtergrond? En ja, randgevallen dus.
Gewijzigd op 13/05/2020 12:22:26 door Thomas van den Heuvel
 
Ozzie PHP

Ozzie PHP

13/05/2020 13:28:49
Quote Anchor link
>> Bovenstaande code kan wellicht korter :).

Dat zou goed kunnen. Laat maar eens zien dan :)

>> Wat als $time_code groter is dan enige key?

In mijn geval pakt ie dan de value van die 'enige key'.
 
Thomas van den Heuvel

Thomas van den Heuvel

13/05/2020 14:21:11
Quote Anchor link
Retourneert weliswaar de key, maar het principe blijft hetzelfde.
Code (php)
PHP script in nieuw venster Selecteer het PHP script
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
31
<?php
// assumption: $input nonempty and sorted
function findTimeSlot($input, $needle) {
    if (array_key_exists($needle, $input)) {
        return $needle;
    }
else {
        $haystack = array_keys($input);
        if ($needle > $haystack[count($haystack) - 1]) {
            return false; // or whatever spec dictates
        } else {
            $haystack[] = $needle;
            sort($haystack);
            $key = array_search($needle, $haystack);
            return ($key > 0 ? $haystack[$key - 1] : false);
        }
    }
}


$in = array(
    '2' => '10:00',
    '4' => '12:00',
    '6' => '14:00',
);


?>
<pre><?php
var_dump(findTimeSlot($in, 1)); // false
var_dump(findTimeSlot($in, 2)); // 2
var_dump(findTimeSlot($in, 4)); // 4
var_dump(findTimeSlot($in, 5)); // 4
var_dump(findTimeSlot($in, 7)); // false
?>
</pre>
 
Ozzie PHP

Ozzie PHP

13/05/2020 15:54:56
Quote Anchor link
Hmmm ... vraag me af of dat nu zoveel korter is :) Mijn code geeft in ieder geval exact de timecode terug en in geval van 7 retourneert ie de timecode van key 6.
 
Rob Doemaarwat

Rob Doemaarwat

13/05/2020 17:58:39
Quote Anchor link
Als je de $times omdraait wordt het iets eenvoudiger (hoef je niet "de vorige" te onthouden, maar ben je gelijk klaar). Blijft dat je last hebt van "randgevallen" (is bij $time_code = 7 het antwoord 14:00, of "not found"; onderstaande code geeft "not found" voor waarden onder 2, maar 14:00 voor waarden boven 6).
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?php

$times
= array(
  '2' => '10:00',
  '4' => '12:00',
  '6' => '14:00',
);

$time_code = 7;
$time = 'not found';
ksort($times); //voor de zekerheid
foreach(array_reverse($times,true) as $c => $t) if($time_code >= $c){
  $time = $t;
  break;
}

print($time);
?>
 
Thomas van den Heuvel

Thomas van den Heuvel

13/05/2020 19:25:37
Quote Anchor link
Nou ja niet zozeer korter dan, maar mogelijk valt er wat te verbeteren qua efficiëntie/schaalbaarheid.

Wie zegt dat $times niet vele malen groter kan worden en/of deze bewerkingen zeer vaak worden uitgevoerd, dan wil je de wat duurdere operaties zoveel mogelijk uitstellen tenzij ze niet te vermijden zijn.

Anyhow, misschien is het interessanter om te weten wat ervoor heeft gezorgd dat deze constructie in eerste instantie nodig was, als je iets in dat ontwerp kunt veranderen is deze bewerking mogelijk helemaal niet nodig.

Dit zijn alle oplossingen en doen ongetwijfeld wat ze moeten doen, maar als de aanpak verkeerd is, dan is dit slechts een voortvloeisel van een verkeerde aanpak :p.
 
Ozzie PHP

Ozzie PHP

13/05/2020 21:21:58
Quote Anchor link
@Rob

Volgens mij klopt jouw code ook. En die is inderdaad een stukje korter. Mooi gedaan!

@Thomas:

>> Dit zijn alle oplossingen en doen ongetwijfeld wat ze moeten doen, maar als de aanpak verkeerd is, dan is dit slechts een voortvloeisel van een verkeerde aanpak :p.

Ja, dat geldt eigenlijk voor alles. Maar is wel even grappig om zo'n stukje code te fabriceren.
 
Ozzie PHP

Ozzie PHP

15/05/2020 12:05:53
Quote Anchor link
En Sebastiaan ... heb je iets aan onze input gehad?

Ik zie dat je gisteren nog een bericht op het forum hebt geplaatst, dus ik neem aan dat je onze reacties ook gezien hebt? Wel zo leuk voor degenen die de moeite hebben genomen om te reageren als je dan even laat weten of je er iets aan hebt gehad.
 
Ivo P

Ivo P

15/05/2020 12:11:11
Quote Anchor link
Staan de indices op volgorde?

dus niet
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
<?php $times = ['3' => '15:00', '1' => '13:00', '2' => '18:00']; ?>


En als je ze gesorteerd hebt: is '10' dan (volgens php) groter of kleiner dan '2' ?

Toevoeging op 15/05/2020 12:12:16:

(en met met stukje php bedoel ik dus in eerste instantie dan 3 eerder erin gezet is dan 1 en 2.
Dus los van dat de tijd bij 2 weer het hoogste is)
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.