Re: [PHP] Re: Switch - Case Statement Questions

2012-11-19 Thread Andrew Ballard
On Sat, Nov 17, 2012 at 4:13 PM, Sebastian Krebs  wrote:
> 2012/11/17 Andrew Ballard 
>
>> On Nov 16, 2012 10:24 PM, "tamouse mailing lists" 
>> wrote:
>> >
>> > On Fri, Nov 16, 2012 at 12:41 PM, Sebastian Krebs 
>> wrote:
>> > > Beside this it can be rewritten as
>> > >
>> > > switch ((int) (($count-1) / 7) {
>> > >   case 0: // 1-7
>> > >   case 1: // 8 - 14
>> > >   default: // above 15
>> > > }
>> >
>> > Nice code refactoring :) Just a tad obscure for someone coming along
>> > later
>>
>> Not only obscure, but depending on the rule being processed could be plain
>> wrong. It works for the values shown so far, but what if another test is
>> added to the use case in the future that doesn't fit the clever solution?
>>
> Like so often in our developers world many things breaks, when it comes to
> new requirements.
>
>> Without knowing the intent of the code, it could be a headache to maintain.
>>
> Interesting, that you see 5 lines of code and assume, that nobody will ever
> get the intent of this code ;) Of course the context is missing. I guess,
> that "$count" is something like "remaining days", or such, because "7" and
> "14" look like "one week" and "two weeks", respectively. Thus I wouldn't
> name the variable "$count" [1], but "$remainingDays" and voila: Context is
> back and so is the intent :)
>
> Of course the above code has a quite limited use-case, but that was the
> requirement (for now, see KISS). If you need more, refactor/rewrite it.


That's precisely my point. If the solution you posted, complete with
your assumptions about the significance of the values "7" and "14",
matches the requirements then use it. If your assumptions were wrong,
and a future revision may potentially require special handling for
certain values like "3" or "8" that cannot be evaluated using your
equation, then the whole block may have to be refactored rather than
simply adding a couple lines for the case. In the spirit of "keeping
it simple," I would prefer the code that requires less refactoring.

I'm not assuming that "nobody will ever get the [coder's] intent" of a
segment of code at all. It's not so much about what the code does, as
WHY it is doing it.

> [1] Even further: I was taught, that if I ever want to name a variable like
> "count", "status", "type", ... I should stop and probably don't use this
> name. In most cases they are used wrong. This example here is quite good:
> "$count" what?

It depends. Generally I agree with you, but if it is a simple loop
counter in a small block of code where variable scope issues and
overall readability of the code is not diminished I'm fine with names
like $count or $n.

Andrew

-- 
PHP General Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php



Re: [PHP] Re: Switch - Case Statement Questions

2012-11-19 Thread Sebastian Krebs
2012/11/19 Tim Streater 

> On 18 Nov 2012 at 14:44, Jim Giner  wrote:
>
> > 2. Using Switch {ALWAYS FIRST CASE!!!}
> >
> > //$boxes = 1;
> > //switch ($count) {
> > //case ($count > 14):
> > //$boxes = 3;
> > //break;
> > //case ($count > 7 && $count <= 14):
> > //$boxes = 2;
> > //break;
> > //case ($count <= 7):
> > //default :
> > //$boxes = 1;
> > //break;
> > //}
>
>
> > To answer Iñigo's comment - the OP's version is very much like an
> > If-ElseIF structure, and nothing like a Switch.
>
> Just so. Perhaps those who are not grasping the point could re-read their
> copy of "The Elements of Programming Style" by Kernighan and Plauger where
> this sort of issue is covered.
>
> See, it's all about expectations. When I worked at SLAC, there was a wise
> guy there who had removed the catalytic converter from his Scirocco and who
> though it clever to race up 280 from San Jose to SLAC at 100mph, sometimes
> slipstreaming behind another idiot doing the same. If I look in my
> rear-view mirror, I expect those I can see to be doing 70mph tops (that's
> what a lot of people did 30 years ago on 280), not 100, and to make
> judgements accordingly. Equally, I have certain expectations when I see a
> switch statement; it trying hard to look like if-elseif-etc is not one of
> them.
>
>
Just a minor rewrite of the original solution

switch (true) {
  case $count <= 7:
$boxes = 1;
break;
  case $count <= 14:
$boxes = 2;
break;
  default:
$boxes = 3;
break;
}


Now -- the idea of "switch" as "select on of some similar cases" in mind":
Is this really breaking any expectation? I think this one is a valid
example, when switch(true) doesn't break the semantic of the
switch-statement.
And if this is already the end of expectations, then (sorry for that) the
expectations are maybe slightly limited :X I don't say "please use
switch(true) wherever possible", but this one is nearly a prototype of a
valid use-case: You have several cases all depending on a single state (the
variable) and all of the same kind "<= constant".


Beside, because it is so extremely simple example, it can become even more
obvious

switch (true) {
  case $count <=  7:  $boxes = 1; break;
  case $count <= 14: $boxes = 2; break;
  default: $boxes = 3; break;
}


Guess some may argue about coding styles now, but thats not the questios
here (and anyway: Even coding styles could/should be broken, if it leads to
better code. Use it wisely ;)). And now: This _can_ break any expectation?


By the way, your car-expectation sounds dangerous...



> --
> Cheers  --  Tim
>
>
> --
> PHP General Mailing List (http://www.php.net/)
> To unsubscribe, visit: http://www.php.net/unsub.php
>



-- 
github.com/KingCrunch


Re: [PHP] Re: Switch - Case Statement Questions

2012-11-19 Thread Stuart Dallas
On 19 Nov 2012, at 19:35, Tim Streater  wrote:

> On 18 Nov 2012 at 14:44, Jim Giner  wrote: 
> 
>> 2. Using Switch {ALWAYS FIRST CASE!!!}
>> 
>> //$boxes = 1;
>> //switch ($count) {
>> //case ($count > 14):
>> //$boxes = 3;
>> //break;
>> //case ($count > 7 && $count <= 14):
>> //$boxes = 2;
>> //break;
>> //case ($count <= 7):
>> //default :
>> //$boxes = 1;
>> //break;
>> //}
> 
> 
>> To answer Iñigo's comment - the OP's version is very much like an
>> If-ElseIF structure, and nothing like a Switch.
> 
> Just so. Perhaps those who are not grasping the point could re-read their 
> copy of "The Elements of Programming Style" by Kernighan and Plauger where 
> this sort of issue is covered.

And of course, nothing is allowed to have changed since 1978! Using a switch in 
that manner is normal for me. Should I change my style simply because you don't 
agree with it? If so, why don't you change your style because I don't agree 
with that? Code is art; there is no "right" way to do it. Can code be shown to 
be more efficient, elegant, faster, cleaner? Yes. Right or wrong? No.

> See, it's all about expectations. When I worked at SLAC, there was a wise guy 
> there who had removed the catalytic converter from his Scirocco and who 
> though it clever to race up 280 from San Jose to SLAC at 100mph, sometimes 
> slipstreaming behind another idiot doing the same. If I look in my rear-view 
> mirror, I expect those I can see to be doing 70mph tops (that's what a lot of 
> people did 30 years ago on 280), not 100, and to make judgements accordingly. 
> Equally, I have certain expectations when I see a switch statement; it trying 
> hard to look like if-elseif-etc is not one of them.

Why is it their fault for doing 100mph and not yours for assuming they're only 
doing 70mph? I'm not saying they're right to be doing 100mph, but I'm 
definitely saying you're wrong for assuming they're only doing 70mph.

Assumptions are the mother of all f*** ups.

-Stuart

-- 
Stuart Dallas
3ft9 Ltd
http://3ft9.com/

--
PHP General Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php



[PHP] Re: Switch - Case Statement Questions

2012-11-19 Thread Tim Streater
On 18 Nov 2012 at 14:44, Jim Giner  wrote: 

> 2. Using Switch {ALWAYS FIRST CASE!!!}
>
> //$boxes = 1;
> //switch ($count) {
> //case ($count > 14):
> //$boxes = 3;
> //break;
> //case ($count > 7 && $count <= 14):
> //$boxes = 2;
> //break;
> //case ($count <= 7):
> //default :
> //$boxes = 1;
> //break;
> //}


> To answer Iñigo's comment - the OP's version is very much like an
> If-ElseIF structure, and nothing like a Switch.

Just so. Perhaps those who are not grasping the point could re-read their copy 
of "The Elements of Programming Style" by Kernighan and Plauger where this sort 
of issue is covered.

See, it's all about expectations. When I worked at SLAC, there was a wise guy 
there who had removed the catalytic converter from his Scirocco and who though 
it clever to race up 280 from San Jose to SLAC at 100mph, sometimes 
slipstreaming behind another idiot doing the same. If I look in my rear-view 
mirror, I expect those I can see to be doing 70mph tops (that's what a lot of 
people did 30 years ago on 280), not 100, and to make judgements accordingly. 
Equally, I have certain expectations when I see a switch statement; it trying 
hard to look like if-elseif-etc is not one of them.

--
Cheers  --  Tim

-- 
PHP General Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php

Re: [PHP] Re: Switch - Case Statement Questions

2012-11-19 Thread Jim Giner

On 11/16/2012 8:33 PM, Iñigo Medina wrote:


On Fri, 16 Nov 2012, Jim Giner wrote:


On 11/16/2012 12:38 PM, Tim Streater wrote:

On 16 Nov 2012 at 12:10, Omar Muhsin  wrote:


Hello,

I was just wondering after writting the code in version 2 here
below, it turns
out in testing that it actually PHP is not validating the
expressions instead
always I get the first case.

1.Using nested if statement {THE INTENDED BEHAVIOR}:
if ($count > 14)
$boxes = 3;
elseif($count > 7 && $count <= 14)


You don't need the count<=14 part as you will *only* get there if
$count<=14.


$boxes = 2;
else
$boxes = 1;

2. Using Switch {ALWAYS FIRST CASE!!!}

//$boxes = 1;
//switch ($count) {
//case ($count > 14):
//$boxes = 3;
//break;
//case ($count > 7 && $count <= 14):
//$boxes = 2;
//break;
//case ($count <= 7):
//default :
//$boxes = 1;
//break;
//}


Does anyone know the answer why using the Switch it always execute
the first
case ?


As has been pointed out you need switch(true).

That's a strange way of writing a switch, IMO. You should be using
the if version.

--
Cheers  --  Tim


Maybe I'm way out of touch, but when I look at php.net for the syntax
of the switch statement I see:
switch($var){
case (value):
(do something)
case (other value):
(do something else)
}

IN your example, you are using a switch syntax that is nothing like
that.  I think that your "case " statements are not actually
evaluating the value of $count, but are themselves evaluating to a
true value that has nothing to do with $count.


That `switch` is evaluating to true each case. It's an alternative of using
if-elseif structure.

iñ



Here's the manual reference:
http://us.php.net/manual/en/control-structures.switch.php

--
PHP General Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php


My point was that the OP is using a widely different syntax for a Switch 
statement, one that I don't understand at all.  According to the Manual 
his statement should be:


 //switch ($count) {
 //case (> 14):
 //$boxes = 3;
 //break;
 //case (> 7):
 //$boxes = 2;
 //break;
 //default :
 //$boxes = 1;
 //break;
 //}


To answer Iñigo's comment - the OP's version is very much like an 
If-ElseIF structure, and nothing like a Switch.


--
PHP General Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php



Re: [PHP] Re: Switch - Case Statement Questions

2012-11-17 Thread tamouse mailing lists
On Sat, Nov 17, 2012 at 2:59 PM, Sebastian Krebs  wrote:
> (Beside: Was "the principle of least surprise" not a ruby-thing? ;))

No, but the Ruby (and Rails) world takes concepts like this and really
runs with them.

Principle of Least Astonishment has been around for quite some time,
with examples known in software engineering, user interface design,
and even real-world objects, It's been in the Patterns wiki for ages:
http://c2.com/cgi/wiki?PrincipleOfLeastAstonishment .

-- 
PHP General Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php



Re: [PHP] Re: Switch - Case Statement Questions

2012-11-17 Thread tamouse mailing lists
On Sat, Nov 17, 2012 at 3:13 PM, Sebastian Krebs  wrote:
> 2012/11/17 Andrew Ballard 
>
>> On Nov 16, 2012 10:24 PM, "tamouse mailing lists" 
>> wrote:
>> > Just a tad obscure for someone coming along
>> > later
>>
>> Without knowing the intent of the code, it could be a headache to maintain.
>>
> Interesting, that you see 5 lines of code and assume, that nobody will ever
> get the intent of this code ;) Of course the context is missing. I guess,
> that "$count" is something like "remaining days", or such, because "7" and
> "14" look like "one week" and "two weeks", respectively. Thus I wouldn't
> name the variable "$count" [1], but "$remainingDays" and voila: Context is
> back and so is the intent :)

This was actually the thrust of my remark about obscurity. I could
easily see how the refactored algorithm worked from the original
code's algorithm. What was obscure was exactly the variable name
$count, i.e., the meaning of the data driving the algorithm. When you
know the actual meaning of data being used, the obscurity goes away.
Hence: useful variable names.

Again, well done, Seb.

-- 
PHP General Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php



Re: [PHP] Re: Switch - Case Statement Questions

2012-11-17 Thread Sebastian Krebs
2012/11/17 Andrew Ballard 

> On Nov 16, 2012 10:24 PM, "tamouse mailing lists" 
> wrote:
> >
> > On Fri, Nov 16, 2012 at 12:41 PM, Sebastian Krebs 
> wrote:
> > > Beside this it can be rewritten as
> > >
> > > switch ((int) (($count-1) / 7) {
> > >   case 0: // 1-7
> > >   case 1: // 8 - 14
> > >   default: // above 15
> > > }
> >
> > Nice code refactoring :) Just a tad obscure for someone coming along
> > later
>
> Not only obscure, but depending on the rule being processed could be plain
> wrong. It works for the values shown so far, but what if another test is
> added to the use case in the future that doesn't fit the clever solution?
>
Like so often in our developers world many things breaks, when it comes to
new requirements.

> Without knowing the intent of the code, it could be a headache to maintain.
>
Interesting, that you see 5 lines of code and assume, that nobody will ever
get the intent of this code ;) Of course the context is missing. I guess,
that "$count" is something like "remaining days", or such, because "7" and
"14" look like "one week" and "two weeks", respectively. Thus I wouldn't
name the variable "$count" [1], but "$remainingDays" and voila: Context is
back and so is the intent :)

Of course the above code has a quite limited use-case, but that was the
requirement (for now, see KISS). If you need more, refactor/rewrite it.



[1] Even further: I was taught, that if I ever want to name a variable like
"count", "status", "type", ... I should stop and probably don't use this
name. In most cases they are used wrong. This example here is quite good:
"$count" what?

Just my 2 cents.
>
> Andrew
>



-- 
github.com/KingCrunch


Re: [PHP] Re: Switch - Case Statement Questions

2012-11-17 Thread Sebastian Krebs
2012/11/17 Tim Streater 

> On 17 Nov 2012 at 01:33, Iñigo Medina  wrote:
>
> > On Fri, 16 Nov 2012, Jim Giner wrote:
>
> >> Maybe I'm way out of touch, but when I look at php.net for the syntax
> of the
> >> switch statement I see:
> >> switch($var){
> >>  case (value):
> >>  (do something)
> >>  case (other value):
> >>  (do something else)
> >> }
> >>
> >> IN your example, you are using a switch syntax that is nothing like
> that.  I
> >> think that your "case " statements are not actually evaluating the
> value of
> >> $count, but are themselves evaluating to a true value that has nothing
> to do
> >> with $count.
> >
> > That `switch` is evaluating to true each case. It's an alternative of
> using
> > if-elseif structure.
>
> It may be an alternative, but it breaks the principle of least surprise.
> If I'm looking through someone's code, and I see a switch, I expect to see
> it used as Jim described. If the writer needs a different type of logic to
> make a decision, that is what the cascaded if-elseif-elseif construct is
> for, when the tests don't fall into a simple set-of-values choice.
>

But switch(true) is not a "surprise" by itself, it becomes to, when the
cases are surprising. And the given example directly fall into "a simple
set-of-values choice", but the problem is, that switch(val) by design only
covers equality "==" and thats what this case is: A set like "(1) between 1
and 7, (2) between 8 and 14, (Default) greater than 14". On the other side
a looong if-elseif*-else-chain is often more confusing and needs
refactoring anyway.

(Beside: Was "the principle of least surprise" not a ruby-thing? ;))


>
> The job of a programmer is not to be "clever" with a view to impress those
> who follow, but to achieve the desired outcome while at the same time
> making life easy for those who follow.
>

I don't see a problem in "case ($count <= 7) or case ($count <= 14) or case
($count > 14)"? I think a developer (or maybe programmer) doesn't need to
be very clever to get the idea behind this.


>
> --
> Cheers  --  Tim
>
>
> --
> PHP General Mailing List (http://www.php.net/)
> To unsubscribe, visit: http://www.php.net/unsub.php
>



-- 
github.com/KingCrunch


Re: [PHP] Re: Switch - Case Statement Questions

2012-11-17 Thread Andrew Ballard
On Nov 16, 2012 10:24 PM, "tamouse mailing lists" 
wrote:
>
> On Fri, Nov 16, 2012 at 12:41 PM, Sebastian Krebs 
wrote:
> > Beside this it can be rewritten as
> >
> > switch ((int) (($count-1) / 7) {
> >   case 0: // 1-7
> >   case 1: // 8 - 14
> >   default: // above 15
> > }
>
> Nice code refactoring :) Just a tad obscure for someone coming along
> later

Not only obscure, but depending on the rule being processed could be plain
wrong. It works for the values shown so far, but what if another test is
added to the use case in the future that doesn't fit the clever solution?
Without knowing the intent of the code, it could be a headache to maintain.

Just my 2 cents.

Andrew


Re: [PHP] Re: Switch - Case Statement Questions

2012-11-17 Thread Stuart Dallas
On 17 Nov 2012, at 10:53, Tim Streater  wrote:

> On 17 Nov 2012 at 01:33, Iñigo Medina  wrote: 
> 
>> On Fri, 16 Nov 2012, Jim Giner wrote:
> 
>>> Maybe I'm way out of touch, but when I look at php.net for the syntax of the
>>> switch statement I see:
>>> switch($var){
>>> case (value):
>>> (do something)
>>> case (other value):
>>> (do something else)
>>> }
>>> 
>>> IN your example, you are using a switch syntax that is nothing like that.  I
>>> think that your "case " statements are not actually evaluating the value of
>>> $count, but are themselves evaluating to a true value that has nothing to do
>>> with $count.
>> 
>> That `switch` is evaluating to true each case. It's an alternative of using
>> if-elseif structure.
> 
> It may be an alternative, but it breaks the principle of least surprise. If 
> I'm looking through someone's code, and I see a switch, I expect to see it 
> used as Jim described. If the writer needs a different type of logic to make 
> a decision, that is what the cascaded if-elseif-elseif construct is for, when 
> the tests don't fall into a simple set-of-values choice.

I don't see how it breaks the "principle of least surprise" (which is a new one 
on me. KISS, yes. Least surprise? Wassat?). If you consider that behaviour to 
be surprising the don't ever go near Perl.

A switch statement is basically saying "take this value and compare it to each 
case below in the order they're presented until one matches, then execute that 
block of code until you hit a break which will jump execution out of the switch 
statement." I don't see how making "this value" true or false makes it any more 
surprising than if it's "squirlookle."

> The job of a programmer is not to be "clever" with a view to impress those 
> who follow, but to achieve the desired outcome while at the same time making 
> life easy for those who follow.

I don't consider that usage of the switch statement to be "clever." It's a 
valid usage of the statement which gives it a lot more power. Specifically the 
ability to have the code for a given case deliberately fall through to the next 
case block is worth any price of admission. And finally, in my opinion, it's 
far cleaner than a succession of if/elseif/else statements, and ultimately gets 
compiled to very similar opcodes.

I agree that the job of a programmer is to balance providing a fast, efficient, 
correct solution and minimising maintenance issues. I see neither side being 
compromised by using a switch statement in this manner, in fact I see both 
sides potentially getting a boost. Just because the usage is unfamiliar or even 
surprising to you doesn't mean it's wrong.

-Stuart

-- 
Stuart Dallas
3ft9 Ltd
http://3ft9.com/
--
PHP General Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php



[PHP] Re: Switch - Case Statement Questions

2012-11-17 Thread Tim Streater
On 17 Nov 2012 at 01:33, Iñigo Medina  wrote: 

> On Fri, 16 Nov 2012, Jim Giner wrote:

>> Maybe I'm way out of touch, but when I look at php.net for the syntax of the
>> switch statement I see:
>> switch($var){
>>  case (value):
>>  (do something)
>>  case (other value):
>>  (do something else)
>> }
>>
>> IN your example, you are using a switch syntax that is nothing like that.  I
>> think that your "case " statements are not actually evaluating the value of
>> $count, but are themselves evaluating to a true value that has nothing to do
>> with $count.
>
> That `switch` is evaluating to true each case. It's an alternative of using
> if-elseif structure.

It may be an alternative, but it breaks the principle of least surprise. If I'm 
looking through someone's code, and I see a switch, I expect to see it used as 
Jim described. If the writer needs a different type of logic to make a 
decision, that is what the cascaded if-elseif-elseif construct is for, when the 
tests don't fall into a simple set-of-values choice.

The job of a programmer is not to be "clever" with a view to impress those who 
follow, but to achieve the desired outcome while at the same time making life 
easy for those who follow.

--
Cheers  --  Tim

-- 
PHP General Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php

Re: [PHP] Re: Switch - Case Statement Questions

2012-11-16 Thread tamouse mailing lists
On Fri, Nov 16, 2012 at 12:41 PM, Sebastian Krebs  wrote:
> Beside this it can be rewritten as
>
> switch ((int) (($count-1) / 7) {
>   case 0: // 1-7
>   case 1: // 8 - 14
>   default: // above 15
> }

Nice code refactoring :) Just a tad obscure for someone coming along
later, perhaps.

-- 
PHP General Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php



Re: [PHP] Re: Switch - Case Statement Questions

2012-11-16 Thread Iñigo Medina


On Fri, 16 Nov 2012, Jim Giner wrote:


On 11/16/2012 12:38 PM, Tim Streater wrote:

On 16 Nov 2012 at 12:10, Omar Muhsin  wrote:


Hello,

I was just wondering after writting the code in version 2 here below, it 
turns
out in testing that it actually PHP is not validating the expressions 
instead

always I get the first case.

1.Using nested if statement {THE INTENDED BEHAVIOR}:
if ($count > 14)
$boxes = 3;
elseif($count > 7 && $count <= 14)


You don't need the count<=14 part as you will *only* get there if 
$count<=14.



$boxes = 2;
else
$boxes = 1;

2. Using Switch {ALWAYS FIRST CASE!!!}

//$boxes = 1;
//switch ($count) {
//case ($count > 14):
//$boxes = 3;
//break;
//case ($count > 7 && $count <= 14):
//$boxes = 2;
//break;
//case ($count <= 7):
//default :
//$boxes = 1;
//break;
//}


Does anyone know the answer why using the Switch it always execute the 
first

case ?


As has been pointed out you need switch(true).

That's a strange way of writing a switch, IMO. You should be using the if 
version.


--
Cheers  --  Tim

Maybe I'm way out of touch, but when I look at php.net for the syntax of the 
switch statement I see:

switch($var){
case (value):
(do something)
case (other value):
(do something else)
}

IN your example, you are using a switch syntax that is nothing like that.  I 
think that your "case " statements are not actually evaluating the value of 
$count, but are themselves evaluating to a true value that has nothing to do 
with $count.


That `switch` is evaluating to true each case. It's an alternative of using
if-elseif structure.

iñ



Here's the manual reference:
http://us.php.net/manual/en/control-structures.switch.php

--
PHP General Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php


-- 
PHP General Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php

[PHP] Re: Switch - Case Statement Questions

2012-11-16 Thread Jim Giner

On 11/16/2012 12:38 PM, Tim Streater wrote:

On 16 Nov 2012 at 12:10, Omar Muhsin  wrote:


Hello,

I was just wondering after writting the code in version 2 here below, it turns
out in testing that it actually PHP is not validating the expressions instead
always I get the first case.

1.Using nested if statement {THE INTENDED BEHAVIOR}:
if ($count > 14)
$boxes = 3;
elseif($count > 7 && $count <= 14)


You don't need the count<=14 part as you will *only* get there if $count<=14.


$boxes = 2;
else
$boxes = 1;

2. Using Switch {ALWAYS FIRST CASE!!!}

//$boxes = 1;
//switch ($count) {
//case ($count > 14):
//$boxes = 3;
//break;
//case ($count > 7 && $count <= 14):
//$boxes = 2;
//break;
//case ($count <= 7):
//default :
//$boxes = 1;
//break;
//}


Does anyone know the answer why using the Switch it always execute the first
case ?


As has been pointed out you need switch(true).

That's a strange way of writing a switch, IMO. You should be using the if 
version.

--
Cheers  --  Tim

Maybe I'm way out of touch, but when I look at php.net for the syntax of 
the switch statement I see:

switch($var){
case (value):
(do something)
case (other value):
(do something else)
}

IN your example, you are using a switch syntax that is nothing like 
that.  I think that your "case " statements are not actually evaluating 
the value of $count, but are themselves evaluating to a true value that 
has nothing to do with $count.


Here's the manual reference:
http://us.php.net/manual/en/control-structures.switch.php

--
PHP General Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php



Re: [PHP] Re: Switch - Case Statement Questions

2012-11-16 Thread Sebastian Krebs
2012/11/16 Tim Streater 

> On 16 Nov 2012 at 12:10, Omar Muhsin  wrote:
>
> > Hello,
> >
> > I was just wondering after writting the code in version 2 here below, it
> turns
> > out in testing that it actually PHP is not validating the expressions
> instead
> > always I get the first case.
> >
> > 1.Using nested if statement {THE INTENDED BEHAVIOR}:
> >if ($count > 14)
> >$boxes = 3;
> >elseif($count > 7 && $count <= 14)
>
> You don't need the count<=14 part as you will *only* get there if
> $count<=14.
>
> >$boxes = 2;
> >else
> >$boxes = 1;
> >
> > 2. Using Switch {ALWAYS FIRST CASE!!!}
> >
> > //$boxes = 1;
> > //switch ($count) {
> > //case ($count > 14):
> > //$boxes = 3;
> > //break;
> > //case ($count > 7 && $count <= 14):
> > //$boxes = 2;
> > //break;
> > //case ($count <= 7):
> > //default :
> > //$boxes = 1;
> > //break;
> > //}
> >
> >
> > Does anyone know the answer why using the Switch it always execute the
> first
> > case ?
>
> As has been pointed out you need switch(true).
>
> That's a strange way of writing a switch, IMO. You should be using the if
> version.
>

Hi,

I've seen long discussions about this ;) I think this one is a example,
where 'switch(true)' is a legit expression, because switch-statements
define a construct, where the interpreter should select one of multiple
similar cases. This one seems legit, because they are very similar ;) It
says "In case of $count look like X do this, or $count look like Y do that,
or $count look like Z do something else (and so on)". For such  I find the
if-elseif-elseif-elseif-elseif-else-construction quite confusing.

Beside this it can be rewritten as

switch ((int) (($count-1) / 7) {
  case 0: // 1-7
  case 1: // 8 - 14
  default: // above 15
}


Regards,
Sebastian


>
> --
> Cheers  --  Tim
>
>
> --
> PHP General Mailing List (http://www.php.net/)
> To unsubscribe, visit: http://www.php.net/unsub.php
>



-- 
github.com/KingCrunch


[PHP] Re: Switch - Case Statement Questions

2012-11-16 Thread Tim Streater
On 16 Nov 2012 at 12:10, Omar Muhsin  wrote: 

> Hello,
>
> I was just wondering after writting the code in version 2 here below, it turns
> out in testing that it actually PHP is not validating the expressions instead
> always I get the first case.
>
> 1.Using nested if statement {THE INTENDED BEHAVIOR}:
>if ($count > 14)
>$boxes = 3;
>elseif($count > 7 && $count <= 14)

You don't need the count<=14 part as you will *only* get there if $count<=14.

>$boxes = 2;
>else
>$boxes = 1;
>
> 2. Using Switch {ALWAYS FIRST CASE!!!}
>
> //$boxes = 1;
> //switch ($count) {
> //case ($count > 14):
> //$boxes = 3;
> //break;
> //case ($count > 7 && $count <= 14):
> //$boxes = 2;
> //break;
> //case ($count <= 7):
> //default :
> //$boxes = 1;
> //break;
> //}
>
>
> Does anyone know the answer why using the Switch it always execute the first
> case ?

As has been pointed out you need switch(true).

That's a strange way of writing a switch, IMO. You should be using the if 
version.

--
Cheers  --  Tim

-- 
PHP General Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php