热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

PHP06Array数组:创建、分类、遍历(0710fri)

主要内容:数组定义、分类及访问

主要内容:


  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('

    %s',print_r($goods, true));

  7. //

    是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('

    %s',print_r( $staff, true));

  7. // 关联
  8. $staff = [];
  9. $staff['id'] = '100';
  10. $staff['name'] = '悟空';
  11. $staff['email'] = 'wk@php.cn';
  12. // printf('

    %s',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('

    %s',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
    '
    ,key($stu), current($stu));
  5. // 访问完成之后指针手工后移。后面依次循环。
  6. next($stu);
  7. // printf('[\'%s\'] => %s
    ',key($stu), current($stu));
  8. // next($stu);
  9. // printf('[\'%s\'] => %s
    ',key($stu), current($stu));
  10. // prev():指针前移
  11. prev($stu);
  12. printf('[\'%s\'] => %s
    '
    ,key($stu), current($stu));
  13. // end()直接到最后一个元素的位置
  14. end($stu);
  15. printf('[\'%s\'] => %s
    '
    ,key($stu), current($stu));
  16. next($stu);
  17. printf('[\'%s\'] => %s
    '
    ,key($stu), current($stu));
  18. // 指针复位:回到第一个 reset()
  19. reset($stu);
  20. printf('[\'%s\'] => %s
    '
    ,key($stu), current($stu));
  21. echo '
    '
    ;

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

  1. reset($stu);
  2. while (true) {
  3. printf('[\'%s\'] => %s
    '
    ,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], '
    '
    ;
  4. }
  5. reset($stu);
  6. for ($i = 0; $i < count($stu); $i++) {
  7. printf('[\'%s\'] => %s
    '
    ,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
    "
    ;
  4. echo is_array($value) ? print_r($value, true) : $value, '
    '
    ;
  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 '这种情况打印出每个子数组:
    '
    ;
  9. //这种情况打印出每个子数组
  10. foreach ($users as $user) {
  11. print_r($user);
  12. foreach ($user as $key => $value) {
  13. echo "['{$key}'] => $value
    "
    ;
  14. }
  15. }
  16. echo '
    '
    ;
  17. echo '这种情况直接打印出二维数组中的每个字段值:
    '
    ;
  18. //这种情况直接打印出二维数组中的每个字段值
  19. foreach ($users as $user) {
  20. printf('id=%s, 姓名=%s, 年龄: %s
    '
    , $user['id'], $user['name'], $user['age']);
  21. }
  22. echo '
    '
    ;
  23. //这种方式可以去除掉前面的字段名
  24. foreach ($users as $user) {
  25. printf('%s, %s, %s
    '
    , $user['id'], $user['name'], $user['age']);
  26. }
  27. echo '
    '
    ;

结果如下图:


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


  • 结构方法遍历在数量少的时候可以用。
  • 这样更好一些,因为生成了一些变量。操作更方便。

  1. // list()解构/解析: 索引数组
  2. list($a, $b,$c) = [100,300,500];
  3. echo $a, $b, $c;
  4. echo '
    '
    ;
  5. // list()解构/解析: 关联数组
  6. list('lesson'=>$lesson, 'grade'=>$grade) = ['lesson'=>'js', 'grade'=> 80];
  7. echo $lesson, ' ---- ', $grade;
  8. echo '
    '
    ;
  9. list('id'=>$id, 'name'=>$name, 'age'=>$age) = ['id' => '101', 'name' => '玉帝', 'age' => 88];
  10. //如果是前面已经定义的二维数组,等号右边可以直接用[]代替,写了也不影响前面二维数组的结果。具体见后面自己的实战部分。
  11. echo $id, $name, $age;
  12. echo '
    '
    ;
  13. foreach ($users as list('id'=>$id, 'name'=>$name, 'age'=>$age) ) {
  14. printf('id=%s, 姓名=%s, 年龄: %s
    '
    , $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
    "
    ;
  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 '
    '
    ;
  11. echo '这个是printf()结果:
    '
    ;
  12. printf('

    %s',print_r($world, true));

  13. echo '
    '
    ;
  14. echo '这个是for循环结果:
    '
    ;
  15. for ($i=0; $i < count($world); $i++) {
  16. echo $world[$i],'
    '
    ;
  17. }
  18. echo '
    '
    ;
  19. echo '这个是while循环1结果:
    '
    ;
  20. $a = 0;
  21. while ($a <= 3) {
  22. echo $world[$a],'
    '
    ;
  23. $a = $a+1;
  24. }
  25. echo '
    '
    ;
  26. echo '这个是while循环2结果:
    '
    ;
  27. reset($world);
  28. while (true) {
  29. printf('[%s] => %s
    '
    ,key($world),current($world));
  30. if (next($world)) continue;
  31. else break;
  32. }
  33. echo '
    '
    ;
  34. echo '这个是foreach遍历结果:
    '
    ;
  35. foreach ($world as $key => $value) {
  36. echo $key.'--'.$value,'
    '
    ;
  37. }
  38. echo '
    '
    ;
  39. echo '这个是list+foreach结果:
    '
    ;
  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最初设置出来的结果:
    '
    ;
  47. //但因为发现好像后面的赋值对结果没有任何影响,就开始做了简化。
  48. foreach ($world as list('id'=>$id, 'name'=>$name, 'size'=>$size) ) {
  49. printf('id=%s, 姓名=%s, 年龄: %s
    '
    , $id, $name, $size);
  50. }
  51. echo '
    '
    ;
  52. //---------------------
  53. list('id'=>$id, 'name'=>$name, 'size'=>$size) = [''=>'',''=>'',''=>''];
  54. echo '这里是list第一种情况出来的结果:
    '
    ;
  55. foreach ($world as list('id'=>$id, 'name'=>$name, 'size'=>$size) ) {
  56. printf('id=%s, 姓名=%s, 年龄: %s
    '
    , $id, $name, $size);
  57. }
  58. echo '
    '
    ;
  59. //---------------------
  60. list('id'=>$id, 'name'=>$name, 'size'=>$size) = [];
  61. echo '这里是list第二种情况出来的结果:
    '
    ;
  62. foreach ($world as list('id'=>$id, 'name'=>$name, 'size'=>$size) ) {
  63. printf('id=%s, 姓名=%s, 年龄: %s
    '
    , $id, $name, $size);
  64. }

结果如图:


" class="reference-link">


推荐阅读
  • 1、创建高级对象使用构造函数来创建对象构造函数是一个函数,调用它来例示并初始化特殊类型的对象。可以使用new关键字来调用一个构造函数。下面给出了使用构造函数的新示例。 ... [详细]
  • 篇首语:本文由编程笔记#小编为大家整理,主要介绍了将JSON数组反序列化为强类型的.NET对象相关的知识,希望对你有一定的参考价值。 ... [详细]
  • C#使用System.Net.Mail类实现邮件发送【.Net开发】
    这篇文章介绍了C#使用System.Net.Mail类实现邮件发送的方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值, ... [详细]
  • 在实际开发中,现在安卓端和后台之间的数据交互,一般都是用JSON来传递数据信息。JSON大家一般都比较熟悉。我这边就以实际项目中的后台传过来的情况和大家分析下及如何处理。比如后台返 ... [详细]
  • springboot 事务 抛出异常_Spring Boot(四) 异常处理
    一、参数校验错误1.注解校验注解校验的常见形式是,在JavaBean类中添加javax.validation校验注解,在控制器方法参数前添加Valida ... [详细]
  • 最近想用js做一个简单的计算器,不过网上的例子好像大部分都是直接从左到右挨个计算,就好像1+2*5,就会先计算1+2,再计算3*5,并没有实现运算符的优先级,这里找到了一种方法实现,来总结一下。不过这 ... [详细]
  • 我正在使用数组列表通过构建一个交互式菜单供用户选择来存储来自用户输入的值。到目前为止,我的两个选择是为用户提供向列表输入数据和读取列表的全部内容。到目前为止,我创建的代码由两个类组成。 ... [详细]
  • 如何用js 实现依赖注入的思想,后端框架思想搬到前端来
    如何用js实现依赖注入的思想,后端框架思想搬到前端来-大家在做些页面的时候,很多都是用ajax实现的,在显示的时候有很多表单提交的add或者update操作,显然这样很烦,突然想到 ... [详细]
  • 简单动态字符串redis里面很多地方都用到了字符串,我们知道redis是一个键值对存储的非关系型数据库,那么所有的key都是用字符串存储的,还有字符串类型,这些都是用字符串存储的 ... [详细]
  • 1.什么是hashcode方法?hashcode方法返回对象的哈希码值在应用程序的执行期间,只要对象的equals方法的比较操作所用到的信息没有改变& ... [详细]
  • C#按值复制数组我有一个类型化的数组MyType[]types;我想制作这个数组的独立副本。我试过这个MyType[]types2newMyType[types.Length];t ... [详细]
  • rbac 4表 常规设计
    rbac4表常规设计设计模型:1、管理员表(users)Schema::create('users',function(Blueprint$table){$tabl ... [详细]
  • 开发笔记:Xunit测试使用个人小结
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了Xunit测试使用个人小结相关的知识,希望对你有一定的参考价值。因工作中用到xunit测试,故总结下用法,以供个人参考使 ... [详细]
  • JavaScript语言自身只有字符串数据类型,没有二进制数据类型。但在处理像TCP流或文件流时,必须使用到二进制数据。因此在Node.js中&#x ... [详细]
  • 每次用到v-charts我都一阵头疼,因为明明是相同的功能,但是我好像每次用到的解决方法都不一样??每次都是在api中各种查,各种尝试…直到做了个各种数据图形的需求,决定还是好好整 ... [详细]
author-avatar
Gray_林剑峰
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有