PHP操作符与流程控制
一、操作符
<?php
//比较运算符返回布尔值
var_dump(10 > 20);
// “==”,“===”
//“==”:值比较,当操作符两边的操作类型不一致,会触发类型自动转换机制
var_dump(100 == '100');
//"===":除了值相等,类型也必须一致
echo '<hr>';
var_dump(100 === '100');
echo '<hr>';
//太空船运算符
var_dump(10 <=> 20);//返回-1
var_dump(10 <=> 5);//返回1
var_dump(10 <=> 10);//返回0
//大于返回1,小于返回-1,相等返回0
echo '<hr>';
//逻辑运算符
//&&: 两边表达式除非全部为true,否则返回false
var_dump((10>20)&&(5>8));
echo '<hr>';
// ||:两边表达式一个为true,全部为true
var_dump((10<20)||(5>8));
echo '<hr>';
//三元运算符
//三元:三个表达式
//二元:二个表达式
$price = 1000;
echo $price > 1500 ? '太贵了' : '太便宜了';
echo '<hr>';
// ??:null合并运算符
echo $password ?? 'root';
二、分支控制与模板语法
<?php
//计算机默认是顺序执行
//分支结构
//1.单分支
$amount = 5500;
$payment = $amount;
/* if ($amount >= 4000){
$payment = $amount * 0.9;
} */
if ($amount >= 5000) $payment = $amount*0.9;
//当流程控制语句中只有一行代码的时候,可以省略大括号
echo '(省略大括号)实际支付:',$payment,'元<hr>';
//模板语法:
if ($amount >= 4000):
$payment = $amount * 0.9;
endif;
/*
模板语法:就是去掉流程控制中的大括号
将起始大括号用冒号代替,将结束大括号用特殊关键字代替
*/
echo '(模板语法)实际支付:',$payment,'元<hr>';
//2.双分支
$amount = 4500;
if ($amount >=5000){
$payment = $amount *0.9;
}else{
$payment = $amount;
}
echo '(双分支)实际支付:',$payment,'元<hr>';
//模板语法:
$amount = 10000;
if ($amount >=5000):
$payment = $amount *0.9;
else:
$payment = $amount;
endif;
echo '(双分支模板语法)实际支付:',$payment,'元<hr>';
//3.多分支
if ($amount > 5000 && $amount < 10000){
$payment = $amount *0.9;
}elseif($amount >= 10000 && $amount < 20000){
$payment = $amount *0.7;
}elseif($amount >= 20000){
$payment = $amount *0.5;
}else{
$payment = $amount;
}
echo '(多分支)实际支付:',$payment,'元<hr>';
//模板语法:
if ($amount > 5000 && $amount < 10000):
$payment = $amount *0.9;
elseif($amount >= 10000 && $amount < 20000):
$payment = $amount *0.7;
elseif($amount >= 20000):
$payment = $amount *0.5;
else:
$payment = $amount;
endif;
echo '(多分支模板语法)实际支付:',$payment,'元<hr>';
// 4.switch:用来简化多分支
//switch:通常用在单值判断中
$amount = 20000;
switch(true){
case $amount > 5000 && $amount < 10000:
$payment = $amount *0.9;
break;
case $amount >= 10000 && $amount < 20000:
$payment = $amount *0.7;
break;
case $amount >= 20000:
$payment = $amount *0.5;
break;
//默认分支
default:
$payment = $amount;
}
echo '(switch)实际支付:',$payment,'元<hr>';
//模板语法:
$amount = 15000;
switch(true):
case $amount > 5000 && $amount < 10000:
$payment = $amount *0.9;
break;
case $amount >= 10000 && $amount < 20000:
$payment = $amount *0.7;
break;
case $amount >= 20000:
$payment = $amount *0.5;
break;
//默认分支
default:
$payment = $amount;
endswitch;
echo '(switch模板语法)实际支付:',$payment,'元<hr>';
三、循环控制与模板语法
1.判断型循环
<?php
$cities = ['合肥','南京','杭州','苏州','上海'];
//判断型循环:入口判断型 while(条件){...}
//判断当前数组元素的值
//current() 函数返回当前被内部指针指向的数组单元的值,并不移动指针。
//如果内部指针指向超出了单元列表的末端,current() 返回 FALSE。
while ($city = current($cities)){
echo $city,'<br>';
next($cities);//指针下移
}
echo '<hr>';
//指针复位
reset ($cities);
echo '指针复位<br>';
while ($city = current($cities)){
echo $city,'<br>';
next($cities);//指针下移
}
//模板语法:
echo '<hr>';
echo '模板语法<br>';
reset ($cities);
while ($city = current($cities)):
echo $city,'<br>';
next($cities);//指针下移
endwhile;
reset ($cities);
echo '<hr>';
echo 'do{}while();没有模板语法';
//出口判断型: do{...} while(条件)
do {
echo $city,'<br>';
next($cities);//指针下移
}while($city = current($cities));
2.for遍历数组
<?php
$cities = ['山西','河南','山东','河北','湖南'];
//遍历数组
echo '<hr>for遍历数组<br>';
//echo count($cities);//统计数组元素个数
//$i:数组元素的索引,默认从0开始
for($i = 0;$i < count($cities);$i++){
echo $cities[$i],'<br>';
}
//$i:数组元素的索引,默认从0开始
//模板语法
echo '<hr>for模板语法<br>';
for($i = 0;$i < count($cities);$i++):
echo $cities[$i],'<br>';
endfor;
//关键字输出拦截break
echo '<hr>break拦截输出<br>';
for($i = 0;$i < count($cities);$i++):
if($i > 2) break;
echo $cities[$i],'<br>';
endfor;
//continue有选择的输出
echo '<hr>continue有选择的输出<br>';
for($i = 0;$i < count($cities);$i++):
if($i === 3)continue;
echo $cities[$i],'<br>';
endfor;
3.用表格来输出二维数组
<?php
//数据表查询结果通常是一个二维数组,用二维数组来模拟
//php可以写在HTML中的任何地方
$users = [
['id'=>1,'name'=>'张三','age'=>20],
['id'=>2,'name'=>'王红','age'=>22],
['id'=>3,'name'=>'李丽','age'=>21],
['id'=>4,'name'=>'刘帅','age'=>22],
];
?>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<?php
$table = '<table border="1" cellspacing="0" cellpadding="0" width="600px">';
for ($i =0; $i < count($users);$i++){
$table .= '<tr>';
$table .= '<td>'.$users[$i]['id'].'</td>';
$table .= '<td>'.$users[$i]['name'].'</td>';
$table .= '<td>'.$users[$i]['age'].'</td>';
$table .= '</tr>';
}
$table .= '</table>';
echo $table.'<hr>';
?>
<table cellspacing="0" cellpadding="0" width="600px">
<?php for ($i =0; $i < count($users);$i++): ?>
<tr>
<td><?php $users[$i]['id'] ?></td>
<td><?php $users[$i]['name'] ?></td>
<td><?php $users[$i]['age'] ?></td>
</tr>
<?php endfor; echo $table;?>
</table>
</body>
</html>
学习总结
1.操作符
例子 |
名称 |
结果 |
-$a |
取反 |
$a 的负值 |
$a + $b |
加法 |
$a 和 $b 的和 |
$a - $b |
减法 |
$a 和 $b 的差 |
$a * $b |
乘法 |
$a 和 $b 的积 |
$a / $b |
除法 |
$a 除以 $b 的商 |
$a % $b |
取模 |
$a 除以 $b 的余数 |
例子 |
名称 |
结果 |
$a & $b |
And(按位与) |
将把 $a 和 $b 中都为 1 的位设为 1。 |
$a | $b |
Or(按位或) |
将把 $a 和 $b 中任何一个为 1 的位设为 1。 |
$a ^ $b |
Xor(按位异或) |
将把 $a 和 $b 中一个为 1 另一个为 0 的位设为 1。 |
~ $a |
Not(按位取反) |
将 $a 中为 0 的位设为 1,反之亦然。 |
例子 |
名称 |
结果 |
$a == $b |
等于 |
TRUE,如果类型转换后 $a 等于 $b。 |
$a === $b |
全等 |
TRUE,如果 $a 等于 $b,并且它们的类型也相同。 |
$a != $b |
不等 |
TRUE,如果类型转换后 $a 不等于 $b。 |
$a <> $b |
不等 |
TRUE,如果类型转换后 $a 不等于 $b。 |
$a !== $b |
不全等 |
TRUE,如果 $a 不等于 $b,或者它们的类型不同。 |
$a < $b |
小与 |
TRUE,如果 $a 严格小于 $b。 |
$a > $b |
大于 |
TRUE,如果 $a 严格大于 $b。 |
$a <= $b |
小于等于 |
TRUE,如果 $a 小于或者等于 $b。 |
$a >= $b |
大于等于 |
TRUE,如果 $a 大于或者等于 $b。 |
$a <=> $b |
太空船运算符(组合比较符) |
当$a小于、等于、大于$b时分别返回一个小于、等于、大于0的integer 值。 PHP7开始提供. |
$a ?? $b ?? $c |
NULL 合并操作符 |
从左往右第一个存在且不为 NULL 的操作数。如果都没有定义且不为 NULL,则返回 NULL。 |
例子 |
名称 |
效果 |
++$a |
前加 |
$a 的值加一,然后返回 $a。 |
$a++ |
后加 |
返回 $a,然后将 $a 的值加一。 |
—$a |
前减 |
$a 的值减一, 然后返回 $a。 |
$a— |
后减 |
返回 $a,然后将 $a 的值减一。 |
例子 |
名称 |
效果 |
$a and $b |
And(逻辑与) |
TRUE,如果 $a 和 $b 都为 TRUE。 |
$a or $b |
Or(逻辑或) |
TRUE,如果 $a 或 $b 任一为 TRUE。 |
$a xor $b |
Xor(逻辑异或) |
TRUE,如果 $a 或 $b 任一为 TRUE,但不同时是。 |
! $a |
Not(逻辑非) |
TRUE,如果 $a 不为 TRUE。 |
$a && $b |
And(逻辑与) |
TRUE,如果 $a 和 $b 都为 TRUE。 |
$a || $b |
Or(逻辑或) |
TRUE,如果 $a 或 $b 任一为 TRUE。 |
2.分支控制
if(条件){
输出结果
}
单分支可以省略大括号
if(条件)输出结果;
模板语法:
if(条件):输出结果; endif;
if(条件){
输出结果
}else{
输出结果
}
模板语法:
if(条件):
输出结果
else:
输出结果
endif;
if(条件){
输出结果
}elseif{
输出结果
}elseif{
输出结果
}else{
输出结果
}
模板语法:
if(条件):
输出结果
elseif:
输出结果
elseif:
输出结果
else:
输出结果
endif;
switch(true){
case (条件):
输出结果;
break;
case (条件):
输出结果;
break;
case (条件):
输出结果;
break;
default:
输出结果;
}
模板语法:
switch(true):
case (条件):
输出结果;
break;
case (条件):
输出结果;
break;
case (条件):
输出结果;
break;
default:
输出结果;
endswitch;
3、判断循环和数组遍历
变量 = ['a','n','b'];
while(变量 = current(变量)){
//current() 函数返回当前被内部指针指向的数组单元的值,并不移动指针
条件为真时执行结果
next(变量);//指针下移
}
模板语法:
while(变量 = current(变量)):
//current() 函数返回当前被内部指针指向的数组单元的值,并不移动指针
条件为真时执行结果
next(变量);//指针下移
endwhile;
变量 = ['a','n','b'];
do{
//直接输出结果
next(变量);//指针下移
}while(变量 = current(变量));
do while没有模板语法
$array=['a','b','c'];
for($i = 0;$i < count($array);$i++){
echo '输出结果$array[$i]';
}
模板语法:
$array=['a','b','c'];
for($i = 0;$i < count($array);$i++):
echo '输出结果$array[$i]';
endfor;