PHP switch and if statement output different results - php

Could someone please explain what's going on here?
Here's the code:
$num = 0;
switch($num){
case ($num==0):
echo $num , " is ZERO";
break;
case ($num>0):
echo $num , " is POSITIVE";
break;
default:echo $num , " is NEGATIVE";
}
The above outputs 0 is POSITIVE
if($num==0){
print ($num." is ZERO");
}
elseif($num>0){
echo $num , " is POSITIVE";
}
else{
echo $num , " is NEGATIVE";
}
This works as expected - 0 is ZERO.
If I replace
case($num==0) with case(0) the output is OK.
Why does the case($num==0) fail?
Someone told me the issue with evaluating multiple expressions in the case statements, but it seems fine syntactically.

switch compares everything in the switch (...) expression to each case:
switch ($num) {
case 0 :
...
case 1 :
...
...
}
You don't write case $num == 0, as that's equivalent to if ($num == 0 == $num).
If at all, you'd have to do:
switch (true) {
case $num == 0 :
...
case $num > 0 :
...
...
}
But there are people who frown upon that.

The logical structure of switch operator is this:
switch($x):
case val1:
action 1;
break;
case val2:
action 2;
break;
default:
not val1 and val2;
switch compares $x with one of the values or gives default branch in case nothing matches. So, you can't write:
case ($num > 0):
or
case ($num == 0 ):
In your case it gives POSITIVE, because php first evaluates the expressions inside cases, and we get the following in the output:
Is $num == 0 ?: yes => 1
Is $num > 0 ?: no => 0
And the real switch php evaluates is this:
$num = 0;
switch($num){
case 1:
echo $num , " is ZERO";
break;
case 0:
echo $num , " is POSITIVE";
break;
default:
echo $num , " is NEGATIVE";
}
Output is: POSITIVE.

Related

strtotime time/date in PHP switch/case statement

I've created a PHP switch / case statement:
switch(true)
{
case ($eff >= '10/2017'):
echo "Greater than 10-2017";
break;
case ($eff <= '09/2017'):
echo "Less thank 10-2017";
break;
default:
echo '';
break;
}
I'm using strtotime to cut down a date from 08/01/2017 to just 08/2017 like this:
$eff = date("m/Y", strtotime($userinfo['ExpDate']));
Unfortunately when I use this to create my case statement it doesn't give me the conditional output. I was hoping for when using a > or < operator and just defaults to the first case statement.
How do I use this to properly use greater/less than?
You can use a solution like the following:
<?php
$eff = date("m/Y", strtotime('10/01/2017'));
$eff = date_create_from_format('m/Y', $eff);
switch(true)
{
case (date_create_from_format('m/Y', '10/2017')->diff($eff)->format('%R%m') >= 0):
echo "Greater than 10-2017";
break;
case (date_create_from_format('m/Y', '09/2017')->diff($eff)->format('%R%m') <= 0):
echo "Less thank 10-2017";
break;
default:
echo '';
break;
}
demo: https://ideone.com/Z2un3C / some tests: https://3v4l.org/YP1Ub

PHP script error when value is zero

I not understand little bit. Simple switch statement not working correctly with zero value (=0):
//$result = $sql->fetchColumn();
$result = 1;
switch ($result) {
case $result <= 2 :
throw new Exception('Error!');
break;
}
Problem is when $result = 0 then output should be 'error' but in this case script passing this validation. Weird question but i can't find a problem.
You can write it like that:
<?php
switch ($i) {
case 0:
case 1:
case 2:
throw new Exception('Error!');
break;
case 3:
echo "i is 3 or higher.";
}
?>
As I said in my comment above, you can't use "grater than" "less than" etc. in a switch-statement. As other said, if you want to make use of them, use a simple IF statement.
this code
switch ($result) {
case $result <= 2 :
is equivalent
if($result == ($result <= 2))
and when
$result=0
we have
( 0 == true )
after type conversion
false === true
and this is false as expected

Why does undivided switch case conditon not works [duplicate]

whats wrong with my switch ?
Now result:
< more
> less
= equality
!= no't equality
As it should be:
< more
= equality
<?php
$page = 99;
switch ($page)
{
case $page < 121:
echo '< more <br/>';
case $page > 123:
echo '> less <br/>';
case $page == 99:
echo '= equality <br/>';
case $page != 99:
echo '!= no\'t equality <br/>';
}
?>
In your switch statement you're comparing a number with boolean values.
Let's take the first case $page < 121 is true, so the comparison taking place is 99==true which is true according to http://docs.php.net/language.types.type-juggling (switch performs a loose comparison, not a strict like ===). Thus the first case block is executed.
And since you don't have a break statement it falls through to the next case block and the next and so on...
Meaning: This won't work as intended regardless of whether you use break or not.
You don't seem to understand how switch works. What you want is a series of if statements, i.e.
if ($page < 121)
echo '< more <br/>';
if ($page > 123)
echo '> less <br/>';
if ($page == 99)
echo '= equality <br/>';
if ($page != 99)
echo '!= no\'t equality <br/>';
Switch is to be used only when you want to compare a variable against a set of values.
switch ($variable)
{
case "me":
echo "variable is me";
break;
case "you":
echo "variable is you";
break;
default:
echo "Variable is neither of us";
}
The above switch case block can be written as shown below:
if ($variable=="me")
{
echo "variable is me";
}
elseif ($variable=="you")
{
echo "variable is you";
}
else
{
echo "variable is neither of us";
}
DO NOT put an expression near the case statement.
switch ($somethng)
{
case $something < 10:
break;
case $something > 20:
break;
}
Switch is meant to be used only for comparing a variable against a set of values. ONLY! For everything else use a if...elseif..else statement.
The block above is wrong usage. Sometimes more than one of those expressions could be true.
$var = "cat";
switch($var)
{
case "cat":
echo 'My '.$var.' is called Bob.';
break;
case "dog":
echo 'My '.$var.' is called James.';
break;
default:
echo "I don't have an animal";
break;
}
In a switch statemant you compare $var against value in a case. If there is a match, the actual case will be executed, otherwise the default will be executed. You can't use <>!=... in a case, only values like: 1, '1', 'dog', $var2, and so on.
If you want to run the same command for two case you can do:
$var = "cat";
switch($var)
{
case "cat":
case "dog":
echo 'My '.$var.' is called James.';
break;
default:
echo "I don't have an animal";
break;
}
In your code, your forgot to put break; at the end of each case, that's why you see 'everything' in your output. And you miss default: too.
For the task you're doing, i suggest you to use if statements.
if iam not wrong you can't use this characters < > raw in html. use instead the entities > and <.
if you run the script in the command line i got following output.
<?php
ob_start();
$page = 99;
switch ($page)
{
case $page < 121:
echo '< more <br/>';
case $page > 123:
echo '> less <br/>';
case $page == 99:
echo '= equality <br/>';
case $page != 99:
echo '!= no\'t equality <br/>';
}
$buffer = ob_get_clean();
echo str_replace('<br/>', "\n", $buffer);
output
< more
> less
= equality
!= no't equality
which seems to be the correct behavoir.
It is important to understand how the
switch statement is executed in order
to avoid mistakes. The switch
statement executes line by line
(actually, statement by statement). In
the beginning, no code is executed.
Only when a case statement is found
with a value that matches the value of
the switch expression does PHP begin
to execute the statements. PHP
continues to execute the statements
until the end of the switch block, or
the first time it sees a break
statement.
http://de.php.net/manual/de/control-structures.switch.php
';
break;
case $page > 123:
echo '> less ';
break;
case $page == 99:
echo '= equality ';
break;
case $page != 99:
echo '!= no\'t equality ';
break;
default: echo 'Default';
}
?>

PHP case switch print message

I am playing about with PHP, At the moment i am working with case switch functions. I want to create random number up to 100 and based on the random number output echo a message.
My php code:
$number = rand(1, $limit);
switch($number){
case "range1":
if($number >=1 || $number <=25 ){
print 'You win nothihg';
}else{
print 'Your Score is: '.$number;
}
break;
case "range2":
if($number >25 || $number <=50 ){
print 'You win Small Prize';
}else{
print 'Your Score is: '.$number;
}
break;
case "range3":
if($number >50 || $number <=75 ){
print 'You win Medium Prize';
}else{
print 'Your Score is: '.$number;
}
break;
case "range4":
if($number >75 || $number <=100){
print 'You win Large Prize';
}else{
print 'Your Score is: '.$number;
}
break;
default:
if($number <=75) {
print 'Keep tryintg untill you win Large';
}
}
The problem I am having that the messages do not get displayed.....I dont know where I am going wrong in here..?
The rand function will return you a number between the limits you set as the 2 arguments, in this case, 1, and the value of $limit
As you are not concatenating your $number variable with the word range, it is never returned as a value, please observe:
$number = rand(1,2);
//$number = 1 or 2
switch($number):
//possible cases are case '1' and case '2'
endswitch;
If you wished to have range concatenated, then:
$number = 'range' . rand(1,$limit);
You have bad condition. Read manual about rand it returns int values.
Also read manual on switch generally switch enters case block if case condition is true. In your case "range1".."range[n]" is always false with comparing to int number.
i would use something like this:
switch($number){
case $number<=1:
echo "less than one";
break;
case $number<=50:
echo "less than 50";
break;
default:
//do something default
}
$number will not return your switch keyword 'range' but it will return an integer value!
Simply put your If-condition as case statement and print the price-size respectively
You are passing a random number to the switch and expecting a string, you'll never be able to display any message, except if you put it in the default case.

php switch case problem

I am trying to say $level > -100 && $level < 100
$level = 0;
switch($level){
case $level > -100:
break;
case $level < 100:
break;
default:
echo '5';
return null;
}
can you use a switch statement like this.
None of the answers presented so far have explicitly connected the spirit of the original question with a proper switch construction. So, for the record:
switch (true) {
case (($level>-100) && ($level<100)):
echo 'in range one';
break;
case (($level>200) && ($level<300)):
echo 'in range two';
break;
default:
echo 'out of range';
}
There's absolutely nothing wrong with this usage of switch.
When you say switch ($level) you're already comparing the value of $level. Each case can then only check for equality, you can't do comparisons like in your example. You'll have to use an if statement instead:
if ($level > -100 && $level < 100)
; // do nothing; equivalent of break in this case
else
echo '5';
Even simpler, just negate the conditions:
if ($level <= -100 || $level >= 100)
echo '5';
Apart of if/else, another way to do it:
switch (true)
case $level > -100:
break;
case $level < 100:
break;
default:
echo '5';
return null;
}
The other answers are both correct and incorrect at the same time. Incorrect, in that it is possible to do what you want in PHP... change switch($level) to switch(true) and your example will work. Correct, in that it's bad form and if any other programmers see that in your code they'll probably come after you with pitchforks. Its not how the switch statement is intended to be used, and wouldn't work like that in most other languages.
No you can't. Switch does only 'equals' type comparison.
No, you can't. The switch statement needs literals in the case blocks. Use an if statements instead:
if(!($level > -100 && $level < 100))
{
echo '5';
return null;
}
This is one of the reasons people advocating case as a superior solution to if-else are off base. I don't like the syntax or the limitations - if-ifelse-else is much more useful.

Categories