webForumDet fria alternativet

Ersätta lång if-sats med nåt smart array-trick?

PHP

5 svar · 639 visningar · startad av Bjuufaren

Medlem sedan okt. 2003108 inlägg
Frågan#1

Hej PHP-hackare! Finns det något sätt att förenkla detta uttryck? Känns som det borde gå att undvika en lång if-else-if-listning men hur jag än vrider och vänder på det så får jag inte till det. Förslag?

$arr = array(0=>0, 1=>1201, 2=>3943, 3=>8600, 4=>12932); // värdena här är av mindre intresse, men de är i stigande ordning

if ($x > $arr[4]) {
	return 4;
} else if ($x > $arr[3]) {
	return 3;
} else if ($x > $arr[2]) {
	return 2;
} else if ($x > $arr[1]) {
	return 1;
} else {
	return 0;
}
Medlem sedan jan. 2003296 inlägg
#2

Har du någon anledning till att du skickar in 0, 1, 2, 3 och 4 (alltså värdenas positioner) till din array, eller kommer de alltid bara att räknas uppåt? Om de bara ska räknas från 0 och uppåt kan du skippa dem.

$arr = array(0, 1201, 3943, 8600, 12932);

$cnt = count($arr);
for ($i = $cnt - 1; $i >= 0; $i--)
{
	if ($x > $arr[$i])
		return $i;
}

return 0;
Medlem sedan sep. 200593 inlägg
#3

ännu enklare med en foreach sats

Medlem sedan sep. 200619 inlägg
#4

ex:

$arr = array(0, 1201, 3943, 8600, 12932);

foreach ($arr as $key => $value) {

	if ($x > $value) echo $key;

}
Medlem sedan sep. 200614 inlägg
#5

salkciN: Men den är väl inte "baklänges"?

Medlem sedan mars 20034 471 inlägg
#6

Moberg skrev:

salkciN: Men den är väl inte "baklänges"?

Nej. Den kommer dessutom att skriva ut
01234
om $x > sista talet.

jawbreaker skrev:

$arr = array(0, 1201, 3943, 8600, 12932); 

$cnt = count($arr); 
for ($i = $cnt - 1; $i >= 0; $i--) 
{ 
    if ($x > $arr[$i]) 
        return $i; 
} 

return 0;

För att kunna särskilja om $x är större eller mindre än första värdet i arrayen bör det nog stå:

$arr = array(0, 1201, 3943, 8600, 12932); 

$cnt = count($arr); 
for ($i = $cnt - 1; $i >= 0; $i--) 
{ 
    if ($x > $arr[$i]) 
        return $i; 
} 

return -1;

0 kan annars betyda två saker....

253 ms totalt · 4 externa anrop · v20260731065814-full.1dc6f849
121 ms — deklarationer (db)
0 ms — hämta statistik (cache)
129 ms — hämta tråd, inlägg och bilagor (db)
117 ms — ändringar (db)