Blogger Information
Blog 62
fans 2
comment 1
visits 42283
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
PHP 06 Array数组:创建、分类、遍历(0710fri)
老黑
Original
729 people have browsed it

主要内容:

  1. 数组定义、分类及访问
  2. 创建数组
  3. 遍历数组(next\prev, while, for, foreach, list赋予变量)

1. 数组分类

  • 索引数组
  • 关联数组
  1. // 1. 索引数组: 位置敏感,访问严重依赖元素在数组中的位置
  2. // 键是数值的索引,表示元素的位置
  3. $goods = [0=>'A1009', 1=>'小米笔记本', 2=>'Air', 3=>5899];
  4. // 索引数组的元素的索引,默认从0开始递增1
  5. $goods = ['A1009', '小米笔记本', 'Air',5899];
  6. printf('<pre>%s</pre>',print_r($goods, true));
  7. //<pre></pre>是html标签,意思是按原样输出不做更改。
  8. //类似上面这种展示的话,就可以形成一个结构化数组形式展示。
  9. //后面也必须用print_r,否则也打印不出来。
  10. //printf中%s的意思见下面。
  11. // PHP sprintf() 函数用到的bai参数
  12. // sprintf() 函数把格式化的字符串du写入一个变量中。
  13. // %% - 返回百分比zhi符号
  14. // %b - 二进制数
  15. // %c - 依照 ASCII 值的dao字符
  16. // %d - 带符号十进制数
  17. // %e - 可续计数法(比如 1.5e+3)
  18. // %u - 无符号十进制数
  19. // %f - 浮点数(local settings aware)
  20. // %F - 浮点数(not local settings aware)
  21. // %o - 八进制数
  22. // %s - 字符串
  23. // %x - 十六进制数(小写字母)
  24. // %X - 十六进制数(大写字母)
  25. // print_r函数打印关于变量的易于理解的信息。
  26. // 语法:mixed print_r ( mixed $expression [, bool return ] )
  27. // 如果变量是string , integer or float , 将会直接输出其值,如果变量是一个数组,则会输出一个格式化后的数组,便于阅读,也就是有key和value对应的那种格式。对于object对象类同。print_r有两个参数,第一个是变量,第二个可设为true,如果设为true,则会返回字符串,否则返回布尔值TRUE。
  28. // 按索引访问
  29. echo $goods[1];
  30. // 2. 关联数组,键的类型是字符串,应该有语义化的
  31. $goods = ['id'=>'A1009', 'name'=>'小米笔记本', 'model'=>'Air','price'=>5899];
  32. // 关联数组的元素访问与元素在数组中的位置无关,只与它的键名相关
  33. echo $goods['id'], $goods['name'];

2. 数组的创建

  • 追加空值创建
  • 关联创建
  • 二维数组
  1. $staff = [];
  2. // 以追加的方式添加
  3. $staff[] = '100';
  4. $staff[] = '悟空';
  5. $staff[] = 'wk@php.cn';
  6. // printf('<pre>%s</pre>',print_r( $staff, true));
  7. // 关联
  8. $staff = [];
  9. $staff['id'] = '100';
  10. $staff['name'] = '悟空';
  11. $staff['email'] = 'wk@php.cn';
  12. // printf('<pre>%s</pre>',print_r( $staff, true));
  13. // 多维(用的最多的是二维,因为数据表解析出来的内容就是用二维表表示的)
  14. $users = [
  15. ['id'=>1, 'name'=>'张三', 'age'=>40],
  16. ['id'=>2, 'name'=>'李四', 'age'=>50],
  17. ['id'=>3, 'name'=>'赵六', 'age'=>60],
  18. ];
  19. printf('<pre>%s</pre>',print_r( $users, true));
  20. echo $users[2]['name'];

3. 数组遍历

3-1. 使用数组指针,逐个遍历

  • 指针后移、前移、复位
  1. $stu = ['id' => '1020', 'name' => '灭绝师太', 'age' => 18, 'course' => 'php', 'grade' => 98];
  2. // current():获取指针当前位置的数组元素的值value
  3. // key():获取指针当前位置的数组元素的键key
  4. printf('[\'%s\'] => %s<br>',key($stu), current($stu));
  5. // 访问完成之后指针手工后移。后面依次循环。
  6. next($stu);
  7. // printf('[\'%s\'] => %s<br>',key($stu), current($stu));
  8. // next($stu);
  9. // printf('[\'%s\'] => %s<br>',key($stu), current($stu));
  10. // prev():指针前移
  11. prev($stu);
  12. printf('[\'%s\'] => %s<br>',key($stu), current($stu));
  13. // end()直接到最后一个元素的位置
  14. end($stu);
  15. printf('[\'%s\'] => %s<br>',key($stu), current($stu));
  16. next($stu);
  17. printf('[\'%s\'] => %s<br>',key($stu), current($stu));
  18. // 指针复位:回到第一个 reset()
  19. reset($stu);
  20. printf('[\'%s\'] => %s<br>',key($stu), current($stu));
  21. echo '<hr>';

3-2. 用while、for循环来实现遍历

  1. reset($stu);
  2. while (true) {
  3. printf('[\'%s\'] => %s<br>',key($stu), current($stu));
  4. if (next($stu)) continue;
  5. else break;
  6. }

3-3. 用for循环来实现遍历

  • for循环也可以遍历关联数组,但很少用
  1. $arr = ['a', 100, 40, 'php'];
  2. for ($i = 0; $i < count($arr); $i++ ) {
  3. echo $arr[$i], '<br>';
  4. }
  5. reset($stu);
  6. for ($i = 0; $i < count($stu); $i++) {
  7. printf('[\'%s\'] => %s<br>',key($stu), current($stu));
  8. next($stu);
  9. }

3-4. 用foreach来实现遍历

  • foreach用得比较多,原因是有下面优点:
  • 第一不需要指针复位,第二不需要手工指针指针,自动后移
  1. // foreach($array as $key=>$value)
  2. foreach ($stu as $key=>$value) {
  3. echo "['{$key}'] => $value <br>";
  4. echo is_array($value) ? print_r($value, true) : $value, '<br>';
  5. }
  6. 结果如下图:

3-5. 用foreach来实现遍历二维数组

  1. echo '二维数组';
  2. $users = [];
  3. $users[] = ['id' => '101', 'name' => '玉帝', 'age' => 88];
  4. $users[] = ['id' => '102', 'name' => '王母', 'age' => 78];
  5. $users[] = ['id' => '103', 'name' => '如来', 'age' => 68];
  6. //这种情况打印不出来。
  7. print_r($user);
  8. echo '这种情况打印出每个子数组:<br><br>';
  9. //这种情况打印出每个子数组
  10. foreach ($users as $user) {
  11. print_r($user);
  12. foreach ($user as $key => $value) {
  13. echo "['{$key}'] => $value <br>";
  14. }
  15. }
  16. echo '<hr>';
  17. echo '这种情况直接打印出二维数组中的每个字段值:<br><br>';
  18. //这种情况直接打印出二维数组中的每个字段值
  19. foreach ($users as $user) {
  20. printf('id=%s, 姓名=%s, 年龄: %s<br>', $user['id'], $user['name'], $user['age']);
  21. }
  22. echo '<hr>';
  23. //这种方式可以去除掉前面的字段名
  24. foreach ($users as $user) {
  25. printf('%s, %s, %s<br>', $user['id'], $user['name'], $user['age']);
  26. }
  27. echo '<hr>';

结果如下图:

3-6. 用list()解构、解析数组

  • 结构方法遍历在数量少的时候可以用。
  • 这样更好一些,因为生成了一些变量。操作更方便。
  1. // list()解构/解析: 索引数组
  2. list($a, $b,$c) = [100,300,500];
  3. echo $a, $b, $c;
  4. echo '<hr>';
  5. // list()解构/解析: 关联数组
  6. list('lesson'=>$lesson, 'grade'=>$grade) = ['lesson'=>'js', 'grade'=> 80];
  7. echo $lesson, ' ---- ', $grade;
  8. echo '<hr>';
  9. list('id'=>$id, 'name'=>$name, 'age'=>$age) = ['id' => '101', 'name' => '玉帝', 'age' => 88];
  10. //如果是前面已经定义的二维数组,等号右边可以直接用[]代替,写了也不影响前面二维数组的结果。具体见后面自己的实战部分。
  11. echo $id, $name, $age;
  12. echo '<hr>';
  13. foreach ($users as list('id'=>$id, 'name'=>$name, 'age'=>$age) ) {
  14. printf('id=%s, 姓名=%s, 年龄: %s<br>', $id, $name, $age);
  15. }

3-7. 用foreach遍历对象(obj)

  1. $obj = new stdClass;
  2. $obj->name = 'admin';
  3. $obj->email = 'admin@php.cn';
  4. $obj->role = '管理员';
  5. foreach ($obj as $prop => $value) {
  6. echo "$prop => $value <br>";
  7. }

4. 自己的实战

  • 最有意思的是二维数组的list部分,发现了一个可以简化的方法。具体见后面
  1. // 1. 数组的定义与访问
  2. // 2. 数组的遍历,使用指针,for/whie,foreach,list全部用到
  3. $world = [];
  4. $world[] = '黑世界';
  5. $world[] = '白世界';
  6. $world[] = '灰世界';
  7. $world[] = '彩色世界';
  8. echo $world;
  9. print_r($world, true);
  10. echo '<hr>';
  11. echo '这个是printf()结果:<br><br>';
  12. printf('<pre>%s</pre>',print_r($world, true));
  13. echo '<hr>';
  14. echo '这个是for循环结果:<br><br>';
  15. for ($i=0; $i < count($world); $i++) {
  16. echo $world[$i],'<br>';
  17. }
  18. echo '<hr>';
  19. echo '这个是while循环1结果:<br><br>';
  20. $a = 0;
  21. while ($a <= 3) {
  22. echo $world[$a],'<br>';
  23. $a = $a+1;
  24. }
  25. echo '<hr>';
  26. echo '这个是while循环2结果:<br><br>';
  27. reset($world);
  28. while (true) {
  29. printf('[%s] => %s<br>',key($world),current($world));
  30. if (next($world)) continue;
  31. else break;
  32. }
  33. echo '<hr>';
  34. echo '这个是foreach遍历结果:<br><br>';
  35. foreach ($world as $key => $value) {
  36. echo $key.'--'.$value,'<br>';
  37. }
  38. echo '<hr>';
  39. echo '这个是list+foreach结果:<br><br>';
  40. $world = [];
  41. $world[] = ['id' => '1', 'name' => '黑世界', 'size' => 589];
  42. $world[] = ['id' => '2', 'name' => '白世界', 'size' => 356];
  43. $world[] = ['id' => '3', 'name' => '灰世界', 'size' => 10009];
  44. $world[] = ['id' => '4', 'name' => '彩世界', 'size' => 26989];
  45. list('id'=>$id, 'name'=>$name, 'size'=>$size) = ['id' => '1', 'name' => '黑世界', 'size' => 81];
  46. echo '这里是list最初设置出来的结果:<br><br>';
  47. //但因为发现好像后面的赋值对结果没有任何影响,就开始做了简化。
  48. foreach ($world as list('id'=>$id, 'name'=>$name, 'size'=>$size) ) {
  49. printf('id=%s, 姓名=%s, 年龄: %s<br>', $id, $name, $size);
  50. }
  51. echo '<hr>';
  52. //---------------------
  53. list('id'=>$id, 'name'=>$name, 'size'=>$size) = [''=>'',''=>'',''=>''];
  54. echo '这里是list第一种情况出来的结果:<br><br>';
  55. foreach ($world as list('id'=>$id, 'name'=>$name, 'size'=>$size) ) {
  56. printf('id=%s, 姓名=%s, 年龄: %s<br>', $id, $name, $size);
  57. }
  58. echo '<hr>';
  59. //---------------------
  60. list('id'=>$id, 'name'=>$name, 'size'=>$size) = [];
  61. echo '这里是list第二种情况出来的结果:<br><br>';
  62. foreach ($world as list('id'=>$id, 'name'=>$name, 'size'=>$size) ) {
  63. printf('id=%s, 姓名=%s, 年龄: %s<br>', $id, $name, $size);
  64. }

结果如图:

" class="reference-link">

Correcting teacher:天蓬老师天蓬老师

Correction status:qualified

Teacher's comments:尽管有多种方式遍历,但实际上只要掌握一种即可, 学习可以多学几种...
Statement of this Website
The copyright of this blog article belongs to the blogger. Please specify the address when reprinting! If there is any infringement or violation of the law, please contact admin@php.cn Report processing!
All comments Speak rationally on civilized internet, please comply with News Comment Service Agreement
0 comments
Author's latest blog post