Waarden tussen arrays checken
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)
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
<?php
$time_code = 2;
$times = array(
'2' => '10:00',
'4' => '12:00',
'6' => '14:00',
);
?>
$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
Code (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
31
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';
?>
$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';
?>
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
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'.
Code (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
31
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>
// 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>
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.
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).
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.
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.
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.
dus niet
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)