- 介绍
- 本地环境安装
- 安装 WNMP 环境
- 代码编辑器选择
- 语法
- 变量与常量
- 常见输出函数
- 数据类型之四种标量类型
- 数据类型之三种复合类型
- 数据类型之两种特殊类型
- Operators:运算符
- 流程控制:条件判断语句
- 流程控制:循环语句
- 流程控制:中止语句
- 函数
- 类和对象:基本概念
- 类和对象:类结构
- 类和对象:面向对象
- 类和对象:三种特殊类
- 类和对象
- 类和对象:Trait
- 类和对象:魔术方法
- 命名空间
- 【实战】PHP表单
-
String
- addcslashes()
- addslashes()
- bin2hex()
- chop()
- chr()
- chunk_split()
- convert_cyr_string()
- convert_uudecode()
- convert_uuencode()
- count_chars()
- crc32()
- crypt()
- echo
- explode()
- fprintf()
- get_html_translation_table()
- hebrev()
- hebrevc()
- hex2bin()
- htmlentities()
- htmlspecialchars()
- htmlspecialchars_decode()
- html_entity_decode()
- implode()
- join()
- lcfirst()
- levenshtein()
- localeconv()
- ltrim()
- md5()
- md5_file()
- metaphone()
- money_format()
- nl2br()
- nl_langinfo()
- number_format()
- ord()
- parse_str()
- printf
- quoted_printable_decode()
- quoted_printable_encode()
- quotemeta()
- rtrim()
- setlocale()
- sha1()
- sha1_file()
- similar_text()
- soundex()
- sprintf()
- sscanf()
- strcasecmp()
- strchr()
- strcmp()
- strcoll()
- strcspn()
- stripcslashes()
- stripos()
- stripslashes()
- strip_tags()
- stristr()
- strlen()
- strnatcasecmp()
- strnatcmp()
- strncasecmp()
- strncmp()
- strpbrk()
- strpos()
- strrchr()
- strrev()
- strripos()
- strrpos()
- strspn()
- strstr()
- strtok()
- strtolower()
- strtoupper()
- strtr()
- str_getcsv()
- str_ireplace()
- str_pad()
- str_repeat()
- str_replace()
- str_rot13()
- str_shuffle()
- str_split()
- str_word_count()
- substr()
- substr_compare()
- substr_count()
- substr_replace()
- trim()
- ucfirst()
- ucwords()
- vfprintf()
- vprintf()
- vsprintf()
- wordwrap()
-
Array
- array()
- array_change_key_case()
- array_chunk()
- array_column()
- array_combine()
- array_count_values()
- array_diff()
- array_diff_assoc()
- array_diff_key()
- array_diff_uassoc()
- array_diff_ukey()
- array_fill()
- array_fill_keys()
- array_filter()
- array_flip()
- array_intersect()
- array_intersect_assoc()
- array_intersect_key()
- array_intersect_uassoc()
- array_intersect_ukey()
- array_keys()
- array_key_exists()
- array_key_first()
- array_key_last()
- array_map()
- array_merge()
- array_merge_recursive()
- array_multisort()
- array_pad()
- array_pop()
- array_product()
- array_push()
- array_rand()
- array_reduce()
- array_replace()
- array_replace_recursive()
- array_reverse()
- array_search()
- array_shift()
- array_slice()
- array_splice()
- array_sum()
- array_udiff()
- array_udiff_assoc()
- array_udiff_uassoc()
- array_uintersect()
- array_uintersect_assoc()
- array_uintersect_uassoc()
- array_unique()
- array_unshift()
- array_values()
- array_walk()
- array_walk_recursive()
- arsort()
- asort()
- compact()
- count()
- current()
- each()
- end()
- extract()
- in_array()
- key()
- key_exists()
- krsort()
- ksort()
- list()
- natcasesort()
- natsort()
- next()
- pos()
- prev()
- range()
- reset()
- rsort()
- shuffle()
- sizeof()
- sort()
- uasort()
- uksort()
- usort()
-
File
- basename()
- chgrp()
- chmod()
- chown()
- clearstatcache()
- copy()
- dirname()
- diskfreespace()
- disk_free_space()
- disk_total_space()
- fclose()
- feof()
- fflush()
- fgetc()
- fgetcsv()
- fgets()
- fgetss()
- file()
- fileatime()
- filectime()
- filegroup()
- fileinode()
- filemtime()
- fileowner()
- fileperms()
- filesize()
- filetype()
- file_exists()
- file_get_contents()
- file_put_contents()
- flock()
- fnmatch()
- fopen()
- fpassthru()
- fputcsv()
- fputs()
- fread()
- fscanf()
- fseek()
- fstat()
- ftell()
- ftruncate()
- fwrite()
- glob()
- is_dir()
- is_executable()
- is_file()
- is_link()
- is_readable()
- is_uploaded_file()
- is_writable()
- is_writeable()
- lchgrp()
- lchown()
- link()
- linkinfo()
- lstat()
- mkdir()
- move_uploaded_file()
- parse_ini_file()
- parse_ini_string()
- pathinfo()
- pclose()
- popen()
- readfile()
- readlink()
- realpath()
- realpath_cache_get()
- realpath_cache_size()
- rename()
- rewind()
- rmdir()
- set_file_buffer()
- stat()
- symlink()
- tempnam()
- tmpfile()
- touch()
- umask()
- unlink()
-
Datetime
- checkdate()
- date()
- date_add()
- date_create()
- date_create_from_format()
- date_date_set()
- date_default_timezone_get()
- date_default_timezone_set()
- date_diff()
- date_format()
- date_get_last_errors()
- date_interval_create_from_date
- date_interval_format()
- date_isodate_set()
- date_modify()
- date_offset_get()
- date_parse()
- date_parse_from_format()
- date_sub()
- date_sunrise()
- date_sunset()
- date_sun_info()
- date_timestamp_get()
- date_timestamp_set()
- date_timezone_get()
- date_timezone_set()
- date_time_set()
- getdate()
- gettimeofday()
- gmdate()
- gmmktime()
- gmstrftime()
- idate()
- localtime()
- microtime()
- mktime()
- strftime()
- strptime()
- strtotime()
- time()
- timezone_abbreviations_list()
- timezone_identifiers_list()
- timezone_location_get()
- timezone_name_from_abbr()
- timezone_name_get()
- timezone_offset_get()
- timezone_open()
- timezone_transitions_get()
- timezone_version_get()
-
Filter
-
HTTP
-
cURL
- curl_close()
- curl_copy_handle()
- curl_errno()
- curl_error()
- curl_escape()
- curl_exec()
- curl_file_create()
- curl_getinfo()
- curl_init()
- curl_multi_add_handle()
- curl_multi_close()
- curl_multi_errno()
- curl_multi_exec()
- curl_multi_getcontent()
- curl_multi_info_read()
- curl_multi_init()
- curl_multi_remove_handle()
- curl_multi_select()
- curl_multi_setopt()
- curl_multi_strerror()
- curl_pause()
- curl_reset()
- curl_setopt()
- curl_setopt_array()
- curl_share_close()
- curl_share_errno()
- curl_share_init()
- curl_share_setopt()
- curl_share_strerror()
- curl_strerror()
- curl_unescape()
- curl_version()
-
PDO
-
PDOStatement
流程控制:循环语句
一个完整的脚本程序应该由一系列语句构成。一条语句也许是一个赋值语句、一个条件判断、一个循环、一个函数调用、或者是什么也不做的空语句。语句通常使用分号结束,并且多个语句可使用花括号进行分组,当做一行语句。
在之前的章节中我们已经学习了赋值语句,这章我们学习 PHP 的流程控制。
流程控制包括条件判断(if
、else
、elseif/else if
、switch
)、循环(while
、do-while
、for
、foreach
)和中止循环(break
、continue
、return
)等。
上一节我们学习了条件判断语句,下面我们来看看循环语句。
在开发过程中经常会遇到需要反复运行同一代码块的情况,例如从数据库中调取了一组数据后需要将之以某种格式输出到屏幕上,如果对每个数据进行单独的输出操作,那就太累了,也不是好的开发实践。那么此时我们就可以使用循环。
循环语句有以下几种:
while
:只要条件为真,就循环执行代码块,直到条件不为真do-while
:不论条件是否为真,先执行一次代码,再根据条件真假循环执行代码块for
:PHP中最复杂的循环结构,循环执行指定的次数,或者当指定条件为真时循环执行代码块foreach
:仅用于数组和对象的遍历
先从while
开始!
while
while
是 PHP 最简单的循环结构,while
先检查条件是否成立,成立则循环代码块。语法如下,其中expression
为判断循环继续的条件:
while(expression)
// 循环代码块
一个简单的示例代码:
<?php
// while
$val = 1;
while ($val < 100) {
echo $val,' ';
$val++;// 循环中止条件
}// 输出从1到99之间所有的数字
do...while
do...while
与while
很像,但是do...while
会先不管不顾地执行一次代码,之后再检查条件,根据条件进行循环。语法如下,其中expression
为判断循环继续的条件:
do {
// 循环代码块
} while(expression);
一个简单的示例:
<?php
// do-while
$val = 1;
do {
echo $val , ' ';
$val++;
} while($val < 100);
上例同样输出 1 到 99 之间的整数,好像与while
循环没有区别。那可以看看下面这个例子:
<?php
// 输出:100
$val = 100;
do {
echo $val , ' ';
$val++;
} while($val < 100);
// 无输出
$val = 100;
while ($val < 100) {
echo $val , ' ';
$val++;
}
由以上代码可看出,相比于while
循环,do...while
适用于至少执行一次的循环。其余情况二者可以互相转化。
for
for
循环用于已知循环次数的情况。语法如下:
for(expression1; expression2; expression3) {
// 循环代码块
}
其中expression1
、expression2
和expression3
都是表达式。第一个表达式在循环前无条件求值(并执行)一次,通常用来定义初始值;第二个表达式则为循环条件,每次循环前如果该值为真,则继续循环;第三个表达式是每次循环后执行。三个表达式都可以为空,也可以是用逗号隔开的多个表达式,但是由于第二个表达式的特殊性(循环判断条件),第二个表达式为空时可能陷入死循环(如果循环代码块中没有带条件的结束语句的话)。
因为for
循环的三个表达式可自定义,增加了for
循环的复杂性(也被称为PHP中最复杂的循环结构)。这里仅作简单讲解,后续将逐渐深入for
循环的使用。
一个简单的示例:
<?php
// for
for ($i = 1; $i < 100; $i++) {
echo $i,' ';
}// 输出1-99之间的整数
echo PHP_EOL;
// 第二个表达式为空时(未设置循环条件)
for ($i = 1; ; $i++) {
if($i > 99)
break;// 循环体内设置有条件的终止语句来跳出循环
echo $i,' ';
}// 输出1-99之间的整数
foreach
foreach
仅用于数组与对象的遍历,如果尝试应用于其他数据类型或者未初始化的变量,将会报错。语法结构如下:
foreach ($variable as $key => $value) {
## 循环体
}
foreach ($variable as $value) {
## 循环体
}
foreach
有两种写法,第一种是遍历变量$variable
的所有值键对($key
为数组元素的键名/对象的公开属性名,$value
为相应的数组元素的值/对象的公开属性值),第二种是只遍历变量$variable
的值。
请看下面简单示例:
<?php
// foreach
$arr = [
'host'=>'https://www.jisuapi.com/',
'name'=>'极速数据',
'profile'=>'极速数据平台提供各类生活数据API,方便开发者快速简单的开发APP、软件及其他服务平台。公交、火车、违章、快递等数据应有尽有。',
'address'=>'浙江省杭州市',
];// 数组
foreach ($arr as $key => $value) {
echo $key , ': ', $value, PHP_EOL;
}
/* 输出:
host: https://www.jisuapi.com/
name: 极速数据
profile: 极速数据平台提供各类生活数据API,方便开发者快速简单的开发APP、软件及其他服务平台。公交、火车、违章、快递等数据应有尽有。
address: 浙江省杭州市
*/
class Site
{
public $host = 'https://www.jisuapi.com/';
public $name = '极速数据';
public $profile = '极速数据平台提供各类生活数据API,方便开发者快速简单的开发APP、软件及其他服务平台。公交、火车、违章、快递等数据应有尽有。';
public $address = '浙江省杭州市';
private $admin = 'Liu';// 私有属性,foreach遍历不可见
protected $statu = true;// 受保护属性,foreach遍历不可见
}
$obj = new Site();// 对象
foreach ($obj as $key => $value) {
echo $key , ': ', $value, PHP_EOL;// 仅可遍历对象的可见属性
}
/* 输出:
host: https://www.jisuapi.com/
name: 极速数据
profile: 极速数据平台提供各类生活数据API,方便开发者快速简单的开发APP、软件及其他服务平台。公交、火车、违章、快递等数据应有尽有。
address: 浙江省杭州市
*/
在foreach
开始循环时,数组内部的指针自动指向第一个数组单元,每次循环时,数组内部指针都会向前移一步(所以在下一次循环时可以得到下一个数组元素)。这同时造成了foreach
内部数组指针的依赖,在循环体内进行一些修改元素、删除元素的值时可能会导致意料之外的错误。
关于流程控制中的循环就先到这里,之后在项目中遇到的各种复杂循环也会通过案例来逐个解决。好的,下一节我们开始学习流程控制中的中止语句!