Value Counter / Calculator - php

I would like to achieve the following: I have a variable A with a value from 1 - 1000. For every 100 the value reaches, a second variable B should get added +1. A third variable C should echo all number of variable A which are less than 100
For example:
$a = 10
$b = 0
$c = 10
$a = 100
$b = 1
$c = 00
$a = 110
$b = 1
$c = 10
$a = 1530
$b = 15
$c = 30
What's the best way to achieve that in PHP? Use str_split() oder count()?

$b = floor($a/100);
$c = $a % 100;
echo 'wow, that was easy';

Related

How to use logical operator in Python as compared to PHP in integers?

I have 2 blocks of code,
test.php -->
$a = 90;
$b = 87;
$c = $a AND $b;
print_r($c);
----------------------
OUTPUT -->
----------------------
90
test.py -->
a = 90
b = 87
c= a and b
print(c)
----------------------
OUTPUT -->
----------------------
87
Now, As I understand both PHP and python when executing the code, interpret the code down to C to machine level (which is the parent language of both)
Then why are they both behaving differently?
What am I doing wrong here?
Thank you for your suggestion.
Code
$a = 90;
$b = 87;
$c = $a AND $b;
is the same as (thanks to operators precedence):
$a = 90;
$b = 87;
($c = $a) AND $b;
So, you just assign $a to $c, and $b... It does nothing.
As for python code:
a = 90
b = 87
c = a and b
print(c)
Python iterpreter returns last value if condition is True. So c is 87. If you write
c = b and a
print(c)
you will see 90. Whoa!
So, if you want same results, the codes should be:
$a = 90;
$b = 87;
$c = $a && $b;
var_dump($c); // bool(true)
and:
a = 90
b = 87
c = bool(a and b)
print(c) // True
I assume that you want to check that both variables a and b are truthy.

Strange Fibonacci results using a list function

I came across a very nice Fibonacci series implementation but I am having trouble understanding how exactly it works. Here are the two implementations I have tried in order to figure out the issue:
<?php
fibo(1000);
fibo2(1000);
function fibo($n){
list($a, $b) = [0, 1];
while($a<=$n){
echo $a . " ";
list($a, $b) = [$b, $a + $b];
}
echo "\n";
}
function fibo2($n){
$a = 0;
$b = 1;
while($a<=$n){
echo $a . " ";
$a = $b;
$b = $a + $b;
}
echo "\n";
}
?>
The above two functions produce the following results respectively:
fibo: 0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987
fibo2: 0 1 2 4 8 16 32 64 128 256 512
Could you please explain why the different results occur?
Explanation repeat:
It as to do with the fact that $a loses its value when it's set to $b's value in the 2nd implementation. In the 1st implementation, the use of list() makes those inputs parameters and thus their values aren't lost when it comes to the assignment. In this case for list(), the value of $a can correctly be used in the assignment when defining $b.
For example:
function fibo2($n){
$a = 0;
$b = 1;
while($a<=$n){
echo $a . " ";
$save_a = $a;
$a = $b;
$b = $save_a + $b;
}
echo "\n";
}
fibo2(1000);
This corrects the 2nd implementation.
With the output being:
0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987

PHP strcmp result int meaning

In php, there is a built-in function strcmp to compare if two strings are same or not.
Returning value is integer number that if the first parameter is greater than the second I get > 0, if not < 0 and if the same 0.
So the part I don't get is comparing string as number.
Does PHP convert string to number and if so how's PHP converting?
$a = 'acorn';
$b = 'zebra';
var_dump( strcmp($a, $b) ); // -25 <- what's this number? seems like alphabetical position...nnn
Doesn't it really matter what number I get, shall I just take what it is?
Looking at the PHP: strcmp doc :
Returns < 0 if str1 is less than str2; > 0 if str1 is greater than
str2, and 0 if they are equal.
So yes, you can use it as it is to compare your string.
But if you want to understand the number returned by the function, it depend on the characters that makes the strings.
In ASCII :
A=65 < B=66 < C=67 ....
So if the string are different, one is gonna be greater than the other.
So you can also test it easily with a short script :
<?php
$a='A';
$b='B';
$c='C';
//Return -1 because $a is smaller than $b by one (65 < 66 )
echo strcmp($a,$b);
//Return -2 because $a is smaller than $c by two (65 < 67 )
echo strcmp($a,$c);
//Return -1 because $b is smaller than $c by one (66 < 67 )
echo strcmp($b,$c);
//Return 1 because $c is greater than $b by one (67 > 66 )
echo strcmp($c,$b);
//Return 2 because $c is greater than $a by two (67 > 65 )
echo strcmp($c,$a);
strcmp is using for comparing two strings in PHP.
If your result is greater the 0 its mean variable one ($a) is greater then Var2($b)
if return result is less then 0 its mean $b is greater and If result is equal to 0 its mean both strings are equal to each other.
$a="Hello world!";
$b= "Hello world!";
var_dump(strcmp($a, $b)); // result is 0
$a = "Hello";
$b = "Hello World";
var_dump(strcmp($a, $b)); // Outputs: -6
and If you want to see difference then you can use this
$a = 'some-content-here-example';
$b = 'some-content-example';
$asp = preg_split('//', $a, -1);
$bsp = preg_split('//', $b, -1);
$l1 = count($asp);
$l2 = count($bsp);
$length = $l1;
if ($l2 > $l1) {
$length = $l2;
}
$record = null;
$x = null;
for ($x = 0; $x < $length; $x++) {
if ($a[$x] != $b[$x]) {
if (!isset($a[$x])) {
$record.= $b[$x];
} else {
$record.= $a[$x];
}
}
}
echo $record;

How can I make calculation pieces in PHP?

How can I make calculation pieces in PHP?
This is my calculation
605,00 / 5% = 30.25.
How can I calculate this in PHP?
$a = 605.00;
$b = 5 (percentage)
How I have tried, but this did not work
$total = ($a / 0.5);
You could do:
$number = 605;
$percentage = 5;
$total = $number * ($percentage / 100);
Actually if you divide 5 by 100, it will equal 0.05 so try $b = .05;.
In basic math, the first decimal is calculated in 10ths, then 100ths, then 1000ths
Just do $total = ($a / $b);
Tested. Total = 12,100 yet will echo 12100
<?php
$a = 605.00;
$b = 0.05;
$total = ($a / $b);
echo $total; // will echo 12100
?>

Which construction is faster?

Which construction is faster:
$a = $b * $c ? $b * $c : 0;
or
$i = $b * $c;
$a = $i ? $i : 0;
All variables are local ones.
Does speed differs for mulitplication, addition, substraction and division?
Update:
Here's some clarification:
This is a theoretical question about writing speed-optimized code from scratch. Not about "searching bottlenecks".
I can measure code speed by myself. But it's was not a question about homework of using microtime(). It was a question about how PHP-interpreter works (what I tried to figure out by digging google myself but was unseccusfull).
Moreover - I did measuring with myself and was a little confused. Different starting values of $a, $b and $c (combinations of zeros, negative, positive, integer and floats) produce different results between constructions. So I was confused.
BoltClock provide me usefull info but user576875 made my day by posting a link to opcode decoder! His answer contains also direct answer to my question. Thanks!
If you have PHP 5.3, this is faster:
$a = $b * $c ?: 0;
This is the same as $a = $b * $c ? $b * $c : 0;, but the $a*$b calcultation is done only once. Also, it doesn't do additional assignments as in your second solution.
Using Martin v. Löwis's benchmark script I get the following times:
$a = $b * $c ?: 0; 1.07s
$a = $b * $c ? $b * $c : 0; 1.16s
$i = $b * $c; $a = $i ? $i : 0; 1.39s
Now these are micro-optimizations, so there is probably many ways of optimizing your code before doing this :)
If it is not the case, you may also want to compare generated PHP OP codes:
1 $a = $b * $c ? $b * $c : 0; :
number of ops: 8
compiled vars: !0 = $a, !1 = $b, !2 = $c
line # op fetch ext return operands
-------------------------------------------------------------------------------
1 0 MUL ~0 !1($b), !2($c)
1 JMPZ ~0, ->5
2 MUL ~1 !1($b), !2($c)
3 QM_ASSIGN ~2 ~1
4 JMP ->6
5 QM_ASSIGN ~2 0
6 ASSIGN !0($a), ~2
7 RETURN null
2 $i = $b * $c; $a = $i ? $i : 0;
number of ops: 8
compiled vars: !0 = $i, !1 = $b, !2 = $c, !3 = $a
line # op fetch ext return operands
-------------------------------------------------------------------------------
1 0 MUL ~0 !1($b), !2($c)
1 ASSIGN !0($i), ~0
2 JMPZ !0($i), ->5
3 QM_ASSIGN ~2 !0($i)
4 JMP ->6
5 QM_ASSIGN ~2 0
6 ASSIGN !3($a), ~2
7 RETURN null
3 $a = $b * $c ?: 0; :
number of ops: 5
compiled vars: !0 = $a, !1 = $b, !2 = $c
line # op fetch ext return operands
-------------------------------------------------------------------------------
1 0 MUL ~0 !1($b), !2($c)
1 ZEND_JMP_SET ~1 ~0
2 QM_ASSIGN ~1 0
3 ASSIGN !0($a), ~1
4 RETURN null
These OP code listings was generated by the VLD extension.
<?php
function run(){
$b=10;
$c=10;
$start=gettimeofday(TRUE);
for($k=0;$k<10000000;$k++){
$a = $b * $c ? $b * $c : 0;
}
printf("%f\n", gettimeofday(TRUE)-$start);
$start=gettimeofday(TRUE);
for($k=0;$k<10000000;$k++){
$i = $b * $c;
$a = $i ? $i : 0;
}
printf("%f\n", gettimeofday(TRUE)-$start);
}
run();
?>
On my system (PHP 5.3.3, Linux, Core i7 2.8GHz), I get
1.593521
1.512892
So the separate assignment is slightly faster. For addition, (+ instead of *), I get the reverse result:
1.386522
1.450358
So you really need to measure these on your own system - with a different PHP version, the outcome may change again.
Your two pieces of code have a drawback each. One does an additional assignment; the other does an additional mathematical operation. Best would be to do neither, which, with the ternary operator in PHP 5.3, you can:
$a = $b * $c ?: 0;
Omitting the second part of the ternary causes PHP to put the result of the first part there instead.
Using Martin v. Löwis's benchmarking code, I reckon this is about 25% faster than either.

Categories