博客列表 >PHP 06 Array数组:创建、分类、遍历(0710fri)

PHP 06 Array数组:创建、分类、遍历(0710fri)

老黑
老黑原创
2020年07月19日 14:00:59728浏览

主要内容:

  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">

声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议