Correcting teacher:天蓬老师
Correction status:qualified
Teacher's comments:尽管有多种方式遍历,但实际上只要掌握一种即可, 学习可以多学几种...
// 1. 索引数组: 位置敏感,访问严重依赖元素在数组中的位置
// 键是数值的索引,表示元素的位置
$goods = [0=>'A1009', 1=>'小米笔记本', 2=>'Air', 3=>5899];
// 索引数组的元素的索引,默认从0开始递增1
$goods = ['A1009', '小米笔记本', 'Air',5899];
printf('<pre>%s</pre>',print_r($goods, true));
//<pre></pre>是html标签,意思是按原样输出不做更改。
//类似上面这种展示的话,就可以形成一个结构化数组形式展示。
//后面也必须用print_r,否则也打印不出来。
//printf中%s的意思见下面。
// PHP sprintf() 函数用到的bai参数
// sprintf() 函数把格式化的字符串du写入一个变量中。
// %% - 返回百分比zhi符号
// %b - 二进制数
// %c - 依照 ASCII 值的dao字符
// %d - 带符号十进制数
// %e - 可续计数法(比如 1.5e+3)
// %u - 无符号十进制数
// %f - 浮点数(local settings aware)
// %F - 浮点数(not local settings aware)
// %o - 八进制数
// %s - 字符串
// %x - 十六进制数(小写字母)
// %X - 十六进制数(大写字母)
// print_r函数打印关于变量的易于理解的信息。
// 语法:mixed print_r ( mixed $expression [, bool return ] )
// 如果变量是string , integer or float , 将会直接输出其值,如果变量是一个数组,则会输出一个格式化后的数组,便于阅读,也就是有key和value对应的那种格式。对于object对象类同。print_r有两个参数,第一个是变量,第二个可设为true,如果设为true,则会返回字符串,否则返回布尔值TRUE。
// 按索引访问
echo $goods[1];
// 2. 关联数组,键的类型是字符串,应该有语义化的
$goods = ['id'=>'A1009', 'name'=>'小米笔记本', 'model'=>'Air','price'=>5899];
// 关联数组的元素访问与元素在数组中的位置无关,只与它的键名相关
echo $goods['id'], $goods['name'];
$staff = [];
// 以追加的方式添加
$staff[] = '100';
$staff[] = '悟空';
$staff[] = 'wk@php.cn';
// printf('<pre>%s</pre>',print_r( $staff, true));
// 关联
$staff = [];
$staff['id'] = '100';
$staff['name'] = '悟空';
$staff['email'] = 'wk@php.cn';
// printf('<pre>%s</pre>',print_r( $staff, true));
// 多维(用的最多的是二维,因为数据表解析出来的内容就是用二维表表示的)
$users = [
['id'=>1, 'name'=>'张三', 'age'=>40],
['id'=>2, 'name'=>'李四', 'age'=>50],
['id'=>3, 'name'=>'赵六', 'age'=>60],
];
printf('<pre>%s</pre>',print_r( $users, true));
echo $users[2]['name'];
$stu = ['id' => '1020', 'name' => '灭绝师太', 'age' => 18, 'course' => 'php', 'grade' => 98];
// current():获取指针当前位置的数组元素的值value
// key():获取指针当前位置的数组元素的键key
printf('[\'%s\'] => %s<br>',key($stu), current($stu));
// 访问完成之后指针手工后移。后面依次循环。
next($stu);
// printf('[\'%s\'] => %s<br>',key($stu), current($stu));
// next($stu);
// printf('[\'%s\'] => %s<br>',key($stu), current($stu));
// prev():指针前移
prev($stu);
printf('[\'%s\'] => %s<br>',key($stu), current($stu));
// end()直接到最后一个元素的位置
end($stu);
printf('[\'%s\'] => %s<br>',key($stu), current($stu));
next($stu);
printf('[\'%s\'] => %s<br>',key($stu), current($stu));
// 指针复位:回到第一个 reset()
reset($stu);
printf('[\'%s\'] => %s<br>',key($stu), current($stu));
echo '<hr>';
reset($stu);
while (true) {
printf('[\'%s\'] => %s<br>',key($stu), current($stu));
if (next($stu)) continue;
else break;
}
$arr = ['a', 100, 40, 'php'];
for ($i = 0; $i < count($arr); $i++ ) {
echo $arr[$i], '<br>';
}
reset($stu);
for ($i = 0; $i < count($stu); $i++) {
printf('[\'%s\'] => %s<br>',key($stu), current($stu));
next($stu);
}
// foreach($array as $key=>$value)
foreach ($stu as $key=>$value) {
echo "['{$key}'] => $value <br>";
echo is_array($value) ? print_r($value, true) : $value, '<br>';
}
结果如下图:
echo '二维数组';
$users = [];
$users[] = ['id' => '101', 'name' => '玉帝', 'age' => 88];
$users[] = ['id' => '102', 'name' => '王母', 'age' => 78];
$users[] = ['id' => '103', 'name' => '如来', 'age' => 68];
//这种情况打印不出来。
print_r($user);
echo '这种情况打印出每个子数组:<br><br>';
//这种情况打印出每个子数组
foreach ($users as $user) {
print_r($user);
foreach ($user as $key => $value) {
echo "['{$key}'] => $value <br>";
}
}
echo '<hr>';
echo '这种情况直接打印出二维数组中的每个字段值:<br><br>';
//这种情况直接打印出二维数组中的每个字段值
foreach ($users as $user) {
printf('id=%s, 姓名=%s, 年龄: %s<br>', $user['id'], $user['name'], $user['age']);
}
echo '<hr>';
//这种方式可以去除掉前面的字段名
foreach ($users as $user) {
printf('%s, %s, %s<br>', $user['id'], $user['name'], $user['age']);
}
echo '<hr>';
结果如下图:
// list()解构/解析: 索引数组
list($a, $b,$c) = [100,300,500];
echo $a, $b, $c;
echo '<hr>';
// list()解构/解析: 关联数组
list('lesson'=>$lesson, 'grade'=>$grade) = ['lesson'=>'js', 'grade'=> 80];
echo $lesson, ' ---- ', $grade;
echo '<hr>';
list('id'=>$id, 'name'=>$name, 'age'=>$age) = ['id' => '101', 'name' => '玉帝', 'age' => 88];
//如果是前面已经定义的二维数组,等号右边可以直接用[]代替,写了也不影响前面二维数组的结果。具体见后面自己的实战部分。
echo $id, $name, $age;
echo '<hr>';
foreach ($users as list('id'=>$id, 'name'=>$name, 'age'=>$age) ) {
printf('id=%s, 姓名=%s, 年龄: %s<br>', $id, $name, $age);
}
$obj = new stdClass;
$obj->name = 'admin';
$obj->email = 'admin@php.cn';
$obj->role = '管理员';
foreach ($obj as $prop => $value) {
echo "$prop => $value <br>";
}
// 1. 数组的定义与访问
// 2. 数组的遍历,使用指针,for/whie,foreach,list全部用到
$world = [];
$world[] = '黑世界';
$world[] = '白世界';
$world[] = '灰世界';
$world[] = '彩色世界';
echo $world;
print_r($world, true);
echo '<hr>';
echo '这个是printf()结果:<br><br>';
printf('<pre>%s</pre>',print_r($world, true));
echo '<hr>';
echo '这个是for循环结果:<br><br>';
for ($i=0; $i < count($world); $i++) {
echo $world[$i],'<br>';
}
echo '<hr>';
echo '这个是while循环1结果:<br><br>';
$a = 0;
while ($a <= 3) {
echo $world[$a],'<br>';
$a = $a+1;
}
echo '<hr>';
echo '这个是while循环2结果:<br><br>';
reset($world);
while (true) {
printf('[%s] => %s<br>',key($world),current($world));
if (next($world)) continue;
else break;
}
echo '<hr>';
echo '这个是foreach遍历结果:<br><br>';
foreach ($world as $key => $value) {
echo $key.'--'.$value,'<br>';
}
echo '<hr>';
echo '这个是list+foreach结果:<br><br>';
$world = [];
$world[] = ['id' => '1', 'name' => '黑世界', 'size' => 589];
$world[] = ['id' => '2', 'name' => '白世界', 'size' => 356];
$world[] = ['id' => '3', 'name' => '灰世界', 'size' => 10009];
$world[] = ['id' => '4', 'name' => '彩世界', 'size' => 26989];
list('id'=>$id, 'name'=>$name, 'size'=>$size) = ['id' => '1', 'name' => '黑世界', 'size' => 81];
echo '这里是list最初设置出来的结果:<br><br>';
//但因为发现好像后面的赋值对结果没有任何影响,就开始做了简化。
foreach ($world as list('id'=>$id, 'name'=>$name, 'size'=>$size) ) {
printf('id=%s, 姓名=%s, 年龄: %s<br>', $id, $name, $size);
}
echo '<hr>';
//---------------------
list('id'=>$id, 'name'=>$name, 'size'=>$size) = [''=>'',''=>'',''=>''];
echo '这里是list第一种情况出来的结果:<br><br>';
foreach ($world as list('id'=>$id, 'name'=>$name, 'size'=>$size) ) {
printf('id=%s, 姓名=%s, 年龄: %s<br>', $id, $name, $size);
}
echo '<hr>';
//---------------------
list('id'=>$id, 'name'=>$name, 'size'=>$size) = [];
echo '这里是list第二种情况出来的结果:<br><br>';
foreach ($world as list('id'=>$id, 'name'=>$name, 'size'=>$size) ) {
printf('id=%s, 姓名=%s, 年龄: %s<br>', $id, $name, $size);
}
结果如图: