PHP While loop with rand() and if statement for rand - php

this is my first post.
I am sorry for the totally amateur question but I want to learn PHP so I started doing some online courses-tutorials for PHP and there was an example without explanation and I can't find the answer on google.
In the code line 4 $flip = rand(0,1); that means that $flip is getting a random number 0 or 1 right?
Then at line 6 there is if ($flip) { ...
But they don't explain what "if ($flip)" means or equals to.
For example $flip = 1 or $flip = 0. Thank you in advance.
$headCount = 0;
$flipCount = 0;
while ($headCount < 3) {
$flip = rand(0,1);
$flipCount ++;
if ($flip){
$headCount ++;
echo "<div class=\"coin\">H</div>";
}
else {
$headCount = 0;
echo "<div class=\"coin\">T</div>";
}
}
echo "<p>It took {$flipCount} flips!</p>";

Basically In PHP expression is evaluated to its Boolean value. for e.g
if($flip) // means if(1) or if(0)
if (expr)
statement
0 : is evaluated as Boolean FALSE
if($flip){
}
else {
// goes here
}
1 : is evaluated as Boolean TRUE (non-zero)
if($flip){
// goes here
}
else {
}
If the value of the first expression is TRUE (non-zero) it enters into if block

You are correct in you first assumption:
$flip = rand(0,1);
$flip will be equal to either 0 or 1. The below for example:
$flip = rand(0,5);
Will return a number between 0 and 5 randomly.
Generally if you do an if statement like so
if($example)
You are testing if the value is true or false. True can also be expressed as 1 and false can also be expressed as 0.
Therefore as $flip is equal to a 0 or 1, it is equal to either true or false. So if flip is true or 1, then it will execute the code in the if statement. As a note you could reverse how the if works by testing for false using:
if(!$flip)
Effectively if $flip is greater than 0 it will be considered true, see the example below:
$test = 0;
if($test) //This will be false and therefore echo It is false
{
echo "It is true";
}
else
{
echo "It is false";
}
$test2 = 5;
if($test2) //This will be true and therefore echo It is true
{
echo "It is true";
}
else
{
echo "It is false";
}
Update
You could consider the following to effectively be the same:
if($flip)
if($flip == 1 || $flip == true || $flip > 0)

A variable equal to 0 means false, other numbers mean true :
if(0) => false // you go in the else statement
if(1) => true
if(2) => true
etc...
In fact, when you do if($flip), the test executed by PHP is if($flip != 0)

Related

php why does TRUE == "expired"?

This drove me nuts for a few hours.
I have a function returning one of the three following values:
function checkValid() {
...
return array("expired",$oldDate,$newDate) ;
return array(true,$oldDate,$newDate) ;
return array(false,$oldDate,$newDate) ;
}
list($isValid,$oDate,$nDate) = checkValid() ;
if ($isValid == "expired") {
...
...do blah
}
...and everytime the condition returned true, the if ($isValid == "expired") { ... } would trigger. So I ran some tests and sure enough:
$isValid = true ;
if ($isValid == "expired") {
echo "Yup...some how 'expired' equals TRUE" ;
} else {
echo "Nope....it doesn't equal true" ;
}
output: Yup...some how 'expired' equals TRUE
When I changed the if/condition to:
$isValid = true ;
if ($isValid === "expired") {
echo "Yup...some how 'expired' equals TRUE" ;
} else {
echo "Nope....it doesn't equal true" ;
}
output: Nope....it doesn't equal true
I am baffled by this. Why would true == 'expired' or 1 == 'expired' ???
When using two equal signs == php does type coersion under the hood and checks for truthy cases which includes all numbers other than 0, boolean true, all string other than empty strings and some other cases.
If you want to check for an exact match, you should use three equal signs ===

How does work if / else?

I have $first and $second. They can have value 0 or 1.
if ( $first AND $second ) {
// True
} else {
// False
}
My mind (and Google search) tells me, that the result is true only when $first == 1 and $second == 0 or vice versa. But the result is true when both of this variables are 1.
I don't understand how does it works.
Your Google searches have failed you. PHP's type juggling means that a 1 is equivalent to TRUE and 0 is equivalent to FALSE. (See also type comparisons). So if both values are 1 then that if statement evaluates to TRUE. If one or both values are 0, it evaluates to FALSE.
<?php
$one = 1;
$zero = 0;
if ($one && $one) {
echo "true\n";
}
else {
echo "false\n";
}
if ($zero && $zero) {
echo "true\n";
}
else {
echo "false\n";
}
if ($one && $zero) {
echo "true\n";
}
else {
echo "false\n";
}
if ($zero && $one) {
echo "true\n";
}
else {
echo "false\n";
}
Program Output
true
false
false
false
Demo
In PHP all values are either "truthy" or "falsy" in expressions.
If a value contains something then it can be said to be truthy. So, values such as 1, "one", [1,2,3] or true all "contain" something and will be interpreted as truthy.
Values that are zeroed or in some way empty are falsy. E.g. 0, "", [] and false.
There is a table of how values are interpreted in the PHP documentation.
You can also just experiment, and output it to your website:
var_dump(1 and 0);

How to check the value and type of a unknown var

I have a variable that can be int or bool, this is because the db from where im querying it change the variable type at some point from bool to int, where now 1 is true and 0 is false.
Since php is "delicate" with the '===' i like to ask if this is the correct why to know if that var is true:
if($wallet->locked === 1 || $wallet->locked === true)
I think in this way im asking for: is the type is int and one? or is the var type bool and true?
How will you approach this problem?
Your code is the correct way.
It indeed checks if the type is integer and the value is 1, or the type is boolean and the value is true.
The expression ($x === 1 || $x === true) will be false in every other case.
If you know your variable is an integer or boolean already, and you're okay with all integers other than 0 evaluating to true, then you can just use:
if($wallet->locked) {
Which will be true whenever the above expression is, but also for values like -1, 2, 1000 or any other non-zero integer.
$wallet->locked = 1;
if($wallet->locked === true){
echo 'true';
}else{
echo 'false';
}
will produce:
false
and
$wallet->locked = 1;
if($wallet->locked == true){
echo 'true';
}else{
echo 'false';
}
will produce:
true
Let me know if that helps!
Your solution seems to be perfect, but You can also use gettype. After that You can check the return value with "integer" or "boolean". Depending on the result You can process the data the way You need it.
solution #1. If $wallet has the value of either false or 0, then PHP will not bother to check its type (because && operator is short-circuit in PHP):
$wallet = true;
//$wallet = 1;
if( $wallet && (gettype($wallet) == "integer" || gettype($wallet) == "boolean") )
{ echo "This value is either 'true and 1' OR it is '1 and an integer'"; }
else { echo "This value is not true"; }
solution #2 (depending on what You want to achieve):
$wallet = 0;
//$wallet = 1; // $wallet = 25;
//$wallet = true;
//$wallet = false;
if($wallet)
{ echo "This value is true"; }
else { echo "This value is not true"; }

Some Confusion in IF Condition of PHP

This is the code
$a = 'Rs 15.25';
if ( $a != '' && $a! = 0 ) {
echo "Inside If";
} else {
echo "Outside If";
}
actually I want to Print "Inside If" so that's why I put $a='Some String Value'. But it always prints "Outside If". Then I changed my code to
$a = 'Rs 15.25';
if ( $a != '' && $a != '0' ) {
echo "Inside If";
} else {
echo "Outside If";
}
I have just added single quotes to 0. Then i got the exact output as i want. But I didn't understand why this happens.
So please help me with this.
PHP does weak type comparison, that is, it converts both operands to the same type before doing the actual comparison.
If one of the operands is a number, the other one is converted to a number as well. If the second operand is a string and contains no digits, it is silently converted to the number 0.
To avoid this whole issue, use string type checking with the operator !== (=== for equality).
if($a !== '' && $a !== 0) {
echo "Inside If";
} else {
echo "Outside If";
}
First of all you when you have multiple conditions on an if statement you should always enclose each of them within brackets
So first thing you should do is to change your code to
$a='Rs 15.25';
if(($a!='') && ($a!='0'))
{
echo "Inside If";
}else
{
echo "Outside If";
}
In PHP 0 = FALSE, 1 = TRUE.
if($a != 0) -> if($a != FALSE)
if $a = 'Rs 15.25', $a != false and $a not empty, then you have echo "Outside If";

PHP compare doubt

if(0 == ('Pictures'))
{
echo 'true';
}
why it's giving me 'true' ?
Your string will be evaluated as an Integer, so becomes 0, use this : 0 === 'Pictures' that verifies identity (same value and same type)
Check PHP type comparison tables to understand how comparison operators behave in PHP.
In your case, 'Pictures' becomes "0" and therefore 0 = 0.
Let's check following example:
echo (int)'Pictures'; // 0 => 'Picture' as int
echo 0 == 'Pictures'; // 1 => true, 0 = 0
Use:
if (0 === 'Pictures')
{
echo 'true';
}
The === is strict type operator, it not only checks the value but the type as well.
Quick Test:
if(0 == 'Pictures')
{
echo 'true';
}
else
{
echo 'false';
}
outputs true but:
if(0 === 'Pictures')
{
echo 'true';
}
else
{
echo 'false';
}
outputs false

Categories