Php преинкремент и постинкремент

Стандартные функции, замыкания

Рекурсивные функции — это функции, вызывающие сами себя. Такой вызов называется рекурсивным. Рекурсия бывает: прямая (функция вызывает сама себя), непрямая (данный вид рекурсии возникает, когда первая функция вызывает вторую, а вторая первую).

Чем отличается цикл while от do while?

Цикл while выполняется только если условие возвращает истину, а цикл do-while в любом случаем выполняется хотя бы один раз (сначала выполняется тело цикла, а потом проверяется условие, если оно возвращает истину цикл повторяется)

Есть ли разница между одинарными и двойными кавычками в PHP?

Да эта разница есть. Когда интерпретатор PHP «видит» одинарные кавычки в коде он воспринимает их содержимое как строку, а в содержимом двойных кавычек парсит (можно использовать переменные в нутри двойных кавычек).

Работа с циклами; пост инкремент; преинкремент, что быстрее и почему?

Постинкремент по сути, как и преинкремент это увеличение (уменьшение) переменной на 1 единицу. Постинкремент, при увеличении на 1 единицу (также не забываем и про —) делает такие шаги:

  1. Создает в памяти ячейку, в которую заносит старое значение переменной
  2. Внутри ячейки увеличивает (или уменьшает) на единицу данное значение
  3. Заменяет исходное значение новым
  4. Удаляет ячейку

В то время, как преинкремент сразу увеличивает (уменьшает) значение в самой переменной, без подобных шагов. Разница в 4 шага!

Дан массив $arr = array(3,8,15,25,16,11,10,5,7,30). Вывести те его элементы, которые делятся на 5.

Для этого нужно использовать операцию «остаток от деления» (%). Условие будет следующего вида: if($num % 5 == 0) echo $num;

Вывести максимальное значение элемента массива array(1,2,3,4,10,100,3,4987,6,7,8,9).

Функция max() принимает массив и возвращает его наибольший элемент

Что такое динамические переменные?

Динамической переменной считается та, имя которой хранится в самой переменной. Это так называемая «переменная переменная». Например:

$var = "first"; $$var = "Second"; # $var == $first == "Second"

$$var — динамическая, ее имя может меняться вместе с изменением $var.

Также, можно связать имя переменной с содержимым другой переменной неявно:

$first = "second"; $second = "third"; print $first; // prints "second" print $$first; // prints "third"

Назови по памяти любые функции для работы со строками, массивами и файлами.

Источник

Php преинкремент и постинкремент

PHP supports C-style pre- and post-increment and decrement operators.

Note: The increment/decrement operators only affect numbers and strings. Arrays, objects, booleans and resources are not affected. Decrementing null values has no effect too, but incrementing them results in 1 .

Increment/decrement Operators
Example Name Effect
++$a Pre-increment Increments $a by one, then returns $a .
$a++ Post-increment Returns $a , then increments $a by one.
—$a Pre-decrement Decrements $a by one, then returns $a .
$a— Post-decrement Returns $a , then decrements $a by one.

Here’s a simple example script:

echo «

Postincrement

» ;
$a = 5 ;
echo «Should be 5: » . $a ++ . «
\n» ;
echo «Should be 6: » . $a . «
\n» ;

Читайте также:  Бретт слаткин секреты python

echo «

Preincrement

» ;
$a = 5 ;
echo «Should be 6: » . ++ $a . «
\n» ;
echo «Should be 6: » . $a . «
\n» ;

echo «

Postdecrement

» ;
$a = 5 ;
echo «Should be 5: » . $a — . «
\n» ;
echo «Should be 4: » . $a . «
\n» ;

echo «

Predecrement

» ;
$a = 5 ;
echo «Should be 4: » . — $a . «
\n» ;
echo «Should be 4: » . $a . «
\n» ;
?>

PHP follows Perl’s convention when dealing with arithmetic operations on character variables and not C’s. For example, in PHP and Perl $a = ‘Z’; $a++; turns $a into ‘AA’ , while in C a = ‘Z’; a++; turns a into ‘[‘ (ASCII value of ‘Z’ is 90, ASCII value of ‘[‘ is 91). Note that character variables can be incremented but not decremented and even so only plain ASCII letters and digits (a-z, A-Z and 0-9) are supported. Incrementing/decrementing other character variables has no effect, the original string is unchanged.

Example #1 Arithmetic Operations on Character Variables

echo ‘== Alphabetic strings ==’ . PHP_EOL ;
$s = ‘W’ ;
for ( $n = 0 ; $n < 6 ; $n ++) echo ++ $s . PHP_EOL ;
>
// Alphanumeric strings behave differently
echo ‘== Alphanumeric strings ==’ . PHP_EOL ;
$d = ‘A8’ ;
for ( $n = 0 ; $n < 6 ; $n ++) echo ++ $d . PHP_EOL ;
>
$d = ‘A08’ ;
for ( $n = 0 ; $n < 6 ; $n ++) echo ++ $d . PHP_EOL ;
>
?>

The above example will output:

== Alphabetic strings == X Y Z AA AB AC == Alphanumeric strings == A9 B0 B1 B2 B3 B4 A09 A10 A11 A12 A13 A14

Incrementing or decrementing booleans has no effect.

User Contributed Notes 10 notes

$a=»9D9″; var_dump(++$a); => string(3) «9E0»

but counting onwards from there

this is due to «9E0» being interpreted as a string representation of the float constant 9E0 (or 9e0), and thus evalutes to 9 * 10^0 = 9 (in a float context)

Regarding character incrementing and PHP following Perl’s convention with character operations.
Actually i found that there is a difference, and incrementing and decrementing unfortunately does not yield the reverse, expected results.
For example, the following piece of code:
echo ‘== Alphabets ==’ . PHP_EOL ;
$s = ‘W’ ;
for ( $n = 0 ; $n < 10 ; $n ++) echo ++ $s . ' ' ;
>
echo PHP_EOL ;

for ( $n = 10 ; $n > 0 ; $n —) echo (— $s ) . ‘ ‘ ;
>
?>
Will output:
== Alphabets ==
X Y Z AA AB AC AD AE AF AG
AG AG AG AG AG AG AG AG AG AG

Please note that the decrement operator has no effect on the character or string.

On the other hand, in Perl, the similar script:

X Y Z AA AB AC AD AE AF AG
-1 -2 -3 -4 -5 -6 -7 -8 -9 -10

Note that the ++ and — don’t convert a boolean to an int. The following code will loop forever.

Читайте также:  Java exception handling classes

This behavior is, of course, very different from that in C. Had me pulling out my hair for a while.

Rule for Increment and decrement:

At some moment we could be confused with increment and decrement in various cases. To avoid such cases, let us follow certain logical rule behind to get successful results with out mess.

$n = 3 ;
echo $n — + — $n ;
echo «
» ;
echo $n ;
?>

1. Postfix form of ++,— operator follows the rule [ use-then-change ],

2. Prefix form (++x,—x) follows the rule [ change-then-use ].

Solution based on the rule:

Step 1:
use then change $n— use is 3 and change is 2

Step 2.
change then use —$n change is 2 and use is 1

Courtesy : stackoverflow : Sunil Dhillon : 4686665

When using the ++ operator by itself on a variable, ++$var is faster than $var++ and uses slightly less memory (in my experiments). It would seem like this could be optimized in the language during runtime (if $var++ is the only thing in the whole statement, it could be treated as ++$var).

I conducted many tests (I believe to be fair), and here’s one of the results:

$i++ took 8.47515535355 seconds and 2360 bytes
++$i took 7.80081486702 seconds and 2160 bytes

Here’s my code. If anyone sees a bias in it, tell me. I conducted it many times, each time going through a loop one million iterations and doing each test 10 — 15 times (10 — 15 million uses of the ++ operator).

ini_set ( ‘MAX_EXEC_TIME’ , 120 );
ob_start ( );

$num_tests = 10 ;
$startFirst = $startSecond = $endFirst = $endSecond = $startFirstMemory = $endFirstMemory = $startSecondMemory = $endSecondMemory = $someVal = 0 ;
$times = array( ‘$i++’ => array( ‘time’ => 0 , ‘memory’ => 0 ), ‘++$i’ => array( ‘total’ => 0 , ‘memory’ => 0 ) );

for( $j = 0 ; $j < $num_tests ; ++ $j )
for( $i = 0 , $startFirstMemory = memory_get_usage ( ), $startFirst = microtime ( true ); $i < 10000000 ; $i ++ )< $someval = 2 ; >
$endFirstMemory = memory_get_usage ( );
$endFirst = microtime ( true );

for( $i = 0 , $startSecondMemory = memory_get_usage ( ), $startSecond = microtime ( true ); $i < 10000000 ; ++ $i )< $someval = 2 ; >
$endSecondMemory = memory_get_usage ( );
$endSecond = microtime ( true );

$times [ ‘$i++’ ][ $j ] = array( ‘startTime’ => $startFirst , ‘endTime’ => $endFirst , ‘startMemory’ => $startFirstMemory , ‘endMemory’ => $endFirstMemory );
$times [ ‘++$i’ ][ $j ] = array( ‘startTime’ => $startSecond , ‘endTime’ => $endSecond , ‘startMemory’ => $startSecondMemory , ‘endMemory’ => $endSecondMemory );
>

for( $i = 0 ; $i < $num_tests ; ++ $i )
$times [ ‘$i++’ ][ ‘time’ ] += ( $times [ ‘$i++’ ][ $i ][ ‘endTime’ ] — $times [ ‘$i++’ ][ $i ][ ‘startTime’ ] );
$times [ ‘++$i’ ][ ‘time’ ] += ( $times [ ‘++$i’ ][ $i ][ ‘endTime’ ] — $times [ ‘++$i’ ][ $i ][ ‘startTime’ ] );
$times [ ‘$i++’ ][ ‘memory’ ] += ( $times [ ‘$i++’ ][ $i ][ ‘endMemory’ ] — $times [ ‘$i++’ ][ $i ][ ‘startMemory’ ] );
$times [ ‘++$i’ ][ ‘memory’ ] += ( $times [ ‘++$i’ ][ $i ][ ‘endMemory’ ] — $times [ ‘++$i’ ][ $i ][ ‘startMemory’ ] );
>

Читайте также:  Изменение цвета ссылок на странице

echo ‘There were ‘ . $num_tests . ‘ tests conducted, here\’s the totals

$i++ took ‘ . $times [ ‘$i++’ ][ ‘time’ ] . ‘ seconds and ‘ . $times [ ‘$i++’ ][ ‘memory’ ] . ‘ bytes

++$i took ‘ . $times [ ‘++$i’ ][ ‘time’ ] . ‘ seconds and ‘ . $times [ ‘++$i’ ][ ‘memory’ ] . ‘ bytes’ ;

Источник

Операторы инкремента и декремента

PHP поддерживает префиксные и постфиксные операторы инкремента и декремента в стиле C.

Замечание: Операторы инкремента/декремента влияют только на строки и числа. Массивы, объекты и ресурсы не трогаются. Декремент NULL также не даст никакого эффекта, однако инкремент даст значение 1.

Операторы инкремента и декремента
Пример Название Действие
++$a Префиксный инкремент Увеличивает $a на единицу, затем возвращает значение $a .
$a++ Постфиксный инкремент Возвращает значение $a , затем увеличивает $a на единицу.
—$a Префиксный декремент Уменьшает $a на единицу, затем возвращает значение $a .
$a— Постфиксный декремент Возвращает значение $a , затем уменьшает $a на единицу.

Приведем пример простого скрипта:

echo «

Постфиксный инкремент

» ;
$a = 5 ;
echo «Должно быть 5: » . $a ++ . «
\n» ;
echo «Должно быть 6: » . $a . «
\n» ;

echo «

Префиксный инкремент

» ;
$a = 5 ;
echo «Должно быть 6: » . ++ $a . «
\n» ;
echo «Должно быть 6: » . $a . «
\n» ;

echo «

Постфиксный декремент

» ;
$a = 5 ;
echo «Должно быть 5: » . $a — . «
\n» ;
echo «Должно быть 4: » . $a . «
\n» ;

echo «

Префиксный декремент

» ;
$a = 5 ;
echo «Должно быть 4: » . — $a . «
\n» ;
echo «Должно быть 4: » . $a . «
\n» ;
?>

PHP следует соглашениям Perl (в отличие от С) касательно выполнения арифметических операций с символьными переменными. Например, в PHP и Perl $a = ‘Z’; $a++; присвоит $a значение ‘AA’, в то время как в C a = ‘Z’; a++; присвоит a значение ‘[‘ (ASCII значение ‘Z’ равно 90, а ASCII значение ‘[‘ равно 91). Следует учесть, что к символьным переменным можно применять операцию инкремента, в то время как операцию декремента применять нельзя, кроме того, поддерживаются только алфавит ASCII и цифры (a-z, A-Z и 0-9). Попытка инкремента/декремента других символьных переменных не будет иметь никакого эффекта, исходная строка останется неизменной.

Пример #1 Арифметические операции с символьными переменными

echo ‘== Алфавит ==’ . PHP_EOL ;
$s = ‘W’ ;
for ( $n = 0 ; $n < 6 ; $n ++) echo ++ $s . PHP_EOL ;
>
// Цифры ведут себя по другому
echo ‘== Цифры ==’ . PHP_EOL ;
$d = ‘A8’ ;
for ( $n = 0 ; $n < 6 ; $n ++) echo ++ $d . PHP_EOL ;
>
$d = ‘A08’ ;
for ( $n = 0 ; $n < 6 ; $n ++) echo ++ $d . PHP_EOL ;
>
?>

Результат выполнения данного примера:

== Алфавит == X Y Z AA AB AC == Цифры == A9 B0 B1 B2 B3 B4 A09 A10 A11 A12 A13 A14

Инкрементирование или декрементирование булевых переменных не приводит ни к какому результату.

Источник

Оцените статью