|
|
|
| Добрый вечер! как-то нужно было определить четным или не четным является текущее число. В интернете нашел такое выражение:
$i=6; if($i % 2 ==0) {echo "четное";} else {echo "нечетное";}
|
Сейчас интересно, что значит этот знак %
<?
echo 6 % 2; //0
echo 5 % 2; //1
?>
|
| |
|
|
|
|
|
|
|
для: ladan
(26.04.2012 в 23:26)
| | Находит остаток от деления | |
|
|
|
|
|
|
|
для: alexander95
(26.04.2012 в 23:29)
| | понятно, спасибо ! | |
|
|
|
|
|
|
|
для: ladan
(26.04.2012 в 23:40)
| | Если речь идет только о проверке четности/кратности числа, то деление по модулю, это не лучший выбор, лучше использовать логические операции, например AND или XOR. | |
|
|
|
|
|
|
|
для: confirm
(26.04.2012 в 23:52)
| | не, мне просто нужно было в цикле таблицу сформировать, чтоб в строке было по 2 ячейке(но за 1 проход всего должна 1 ячейка выводиться). Сейчас проблем никаких нет :) спасибо | |
|
|
|
|
|
|
|
для: ladan
(27.04.2012 в 01:54)
| | А это думаете не проверка на четность/кратность?
<?
for($i=0; $<10; $i++) echo $i ^ 1
|
Логические операции проще, выполняются намного быстрее, чем деление. | |
|
|
|
|
|
|
|
для: confirm
(27.04.2012 в 01:58)
| | Из Вашего примера я хз как сделать проверку на четность. Сейчас работает так:
<?
echo "<table class='my_list'>";
while($list_row = mysql_fetch_assoc($list))
{
$i++;
if($i % 2 !=0) {echo "<tr>";}
echo "<td>".$list_row['name']."</td>";
if($i % 2 ==0) {echo "</tr>";}
}
echo "</table>";
}
?>
|
| |
|
|
|
|
|
|
|
для: ladan
(27.04.2012 в 02:18)
| |
<?
echo "<table border=1>";
for($i=0; $i<10; $i++) {
if(!($i & 1)) echo "<tr>";
echo "<td>name</td>";
if($i & 1) echo "</tr>";
}
echo "</table>";
|
PS. Учитывая, что у вас внешний счетчик, а значит и начинать первую строку лучше до цикла, то еще проще:
<?
echo "<table border=1><tr>";
$i=0;
while($i<10) {
echo "<td>name</td>";
if($i & 1) echo "</tr><tr>";
$i++;
}
echo "</tr></table>";
|
| |
|
|
|
|
|
|
|
для: confirm
(27.04.2012 в 03:17)
| | Спасибо, с первым вариантом понятно, его и использую, а второй какой-то непонятный для меня. Там где if($i & 1) echo "</tr><tr>"; echo ведь должен в одной строке вывести? А получается какая-то магия, что сначала выводится <tr> потом две ячейки и </tr> | |
|
|
|
|
|
|
|
для: ladan
(27.04.2012 в 10:11)
| | Да никакой магии в этом нет, простое "сим-селябим, ахалай-махалай". В таблице еще до цикла открывается первая строка, а в начале цикла, в первой его итерации, мы знаем точно, что должен начинаться вывод ячейки. Выводим ячейку и проверяем, если счетчик четный (вывели уже две ячейки), а это произойдет только если он принял значение 1 (1 & 1 = 1), то закрываем строку таблицы и открываем новую. При следующих итерациях открытая строка будет закрываться (после двух ячеек), и открываться следующая, и т.д.. Ну а после цикла закрываем последнюю строку, так как последняя итерация цикла этого не делает, что видно из кода.
Вы не используете первый вариант мой, вы используете деление по модулю. Кстати, необходимости писать !=0 и ==0 нет, ибо вам и так возвращается истина или ложь. | |
|
|
|
|
|
|
|
для: confirm
(27.04.2012 в 10:48)
| | Спасибо, теперь понятно, я уже ваш вариант использую =) | |
|
|
|
|
|
|
|
для: ladan
(28.04.2012 в 10:32)
| | Естественно, понять это не сложно, если хорошо оперировать нуликами и единичками. ) И когда это возможно, то применять это, либо в комбинации. Например, требуется к переменной $a прибавлять 1, если переменная $b не кратна 10, в противном случае ничего не прибавлять к ней. И желательно решить эту задачу без всяких условных проверок, то есть чтобы выполнялась автоматом, не нервируя лишними if. В данном случае "чистая логика" не будет работать (почему, подумайте сами), а поэтому будем использовать деление по модулю 10. А чтобы отказаться от if и else, будем приводить результат деления к логическому значению, вот так:
<?
$a = 9;
for($b=0; $b<40; $b++) echo ($a+(bool)($b%10)).'<br>'
|
Если потребуется обратное, при кратном прибавлять 1, иначе ничего, то можно применить операцию XOR, которая в данном случае будет выполнять роль инвертора:
Это еще не все. Операцию деления на 2 можно заменить сдвигом вправо, а умножения на 2 сдвигом влево.
4/2 эквивалентно 4>>1
2*2 эквивалентно 2<<1
но логические операции будут работать быстрее. Есть правда и минус - если делимое не четное (младший бит равен 1), то результат будет неправильный, так как при сдвиге получаем перенос, который не учитывается (в РНР) и не анализируется. Но этот минус может обернуться и плюсом, если к примеру нужно будет получать от результата деления целые числа, без учета остатка. В этом случае традиционным способом придется выполнять нечто:
floor(3/2) - две операции
3 >> 1 - а сдвигом получаем результат всего одной быстрой операцией.
А это 2 << 3 эквивалентно pow(2, 4). | |
|
|
|