博客列表 >PHP 07 数组array常用操作函数(0713mon)

PHP 07 数组array常用操作函数(0713mon)

老黑
老黑原创
2020年08月02日 12:04:27593浏览

主要内容:

  1. 数组的key与value函数:array_keys($arr)、array_values($arr);
  2. 栈与队列
  3. 数组排序
  4. 数组的切片(slice)及增删改(splice)
  5. 数组的合并(array_combine)
  6. 数组的回调函数(array_filter及array_map())
  7. implode(转为字符串)、extract(转为变量)、compact(变量转为数组)

1. 数组的key与value函数

  • array_keys($arr)、array_values($arr)
  1. <?php
  2. // ① 键名相关
  3. $arr = ['id'=>1, 'name'=>'admin', 'email'=> 'admin@php.cn'];
  4. // $keys = [];
  5. // echo key($arr);
  6. // next($arr);
  7. // echo key($arr);
  8. // while ( key($arr)) {
  9. // $keys[] = key($arr);
  10. // next($arr);
  11. // }
  12. // print_r($keys);
  13. // echo "<hr>";
  14. //简化的方式获得所有的keys。
  15. print_r(array_keys($arr));
  16. //检查一个key是否存在?
  17. echo array_key_exists('status', $arr) ? '存在' : '不存在', '<hr>';
  18. // 拿到第一个key或最后一个key
  19. echo array_key_first($arr);
  20. echo array_key_last($arr);
  21. // ② 与值相关
  22. $arr = [3 => 10, 9 => 20, 0 => 'html', 'id' => 'css', 20 => 20, 30];
  23. // print_r($arr);
  24. // 获取所有值
  25. // $valus = [];
  26. // foreach ($arr as $value) {
  27. // $values[] = $value;
  28. // }
  29. // print_r($values);
  30. // array_values():返回数组的元素的值组成的索引数组
  31. print_r(array_values($arr));
  32. // echo in_array('css3', $arr) ? '找到了' : '没有', '<hr>';
  33. // array_search():找到了返回元素值对应的键名,找不到返回布尔false
  34. // var_dump(array_search('css3', $arr));
  35. // 函数:功能, 参数, 返回值
  36. // 去重
  37. print_r(array_unique($arr));
  38. $arr = [10, 20, 30,'123', '888php'];
  39. echo array_sum($arr); //字符串也会转为数字 - 取其中的数据,但如果是字母先开始,则变为0。
  40. echo array_product($arr); //所有相乘

2. 栈与队列

  • 栈和队是两种现象,没有对应的名称之类的进行限定。
  • 栈像“死胡同”,先进后出,后进先出;队则是“活胡同”,次序进出。
  • ‘进’有两个:push(尾部进),unshift(头部进)。
  • ‘出’有两个:pop(尾部出),shift(头部出)。
  1. <?php
  2. // 栈: 是添加与删除受限的一种数据结构,数据的增删仅允许在一端进行, LIFO,最后进最先出
  3. $stack = [];
  4. // 在栈的尾部进行增删
  5. echo array_push($stack, 10, 20, 30);
  6. print_r($stack);
  7. echo '<br><hr>';
  8. echo array_pop($stack); // 从最后一个逐步弹出,知道没有
  9. echo array_pop($stack);
  10. echo array_pop($stack);
  11. var_dump(array_pop($stack));
  12. echo '<br><hr>';
  13. // 在栈的头部进行增删
  14. echo array_unshift($stack, 'php', 'mysql');
  15. print_r($stack);
  16. echo '<br><hr>';
  17. echo array_shift($stack);
  18. echo array_shift($stack);
  19. // 队: 先进先出FIFO
  20. $queue = [];
  21. // 尾部进队 + 头部出队, array_push + array+shift
  22. // 尾部进队
  23. array_push($queue, 10,20,30);
  24. print_r($queue);
  25. echo '<br><hr>';
  26. // 头部出队,对照栈,栈尾部进,尾部出
  27. echo array_shift($queue);
  28. echo array_shift($queue);
  29. echo array_shift($queue);
  30. echo '<br><hr>';
  31. // 头部进队+尾部出队 + , array_unshift + array+pop
  32. // o:这种情况应该就是栈了。这是否也意味着array_push和array_unshift是一样的?
  33. array_unshift($queue, 'one', 'two', 'three');
  34. print_r($queue);
  35. echo '<br>';
  36. echo array_pop($queue);
  37. echo array_pop($queue);
  38. echo array_pop($queue);
  39. echo array_pop($queue);//最后一个应该就没出了
  40. echo '<br>';
  41. print_r($queue); //里面就没有内容了
  42. echo '<br><hr>';
  43. //具体如图:
  44. // 自己的一个测试
  45. // ‘进’有两个:push(尾部进),unshift(头部进)
  46. $train=[];
  47. array_push($train,'1','2','3');
  48. array_unshift($train,'four','five','six');
  49. array_push($train,'7','8','9');
  50. array_unshift($train,'ten');
  51. print_r($train);
  52. echo '<br><hr>';
  53. // 自己的一个测试
  54. // ‘出’有两个:pop(尾部进),shift(头部出)
  55. array_pop($train);
  56. array_shift($train);
  57. array_pop($train);
  58. array_shift($train);
  59. print_r($train);
  60. echo '<br><hr>';
  61. // 应用-传统创建数组之外的另外一种方式
  62. $arr = [];
  63. array_push($arr, 'a');
  64. array_push($arr, 'b');
  65. array_push($arr, 'c');
  66. print_r($arr);
  67. //一种应用,例如形成一个url,或者从url中取&间隔开的参数等。
  68. // http:://php.io/index.php?m=module&c=controller&a=add

3. 数组排序

  1. <?php
  2. $arr = [30, 4, 82, 15, 20, 'abc', 'hello', 2, 46];
  3. // print_r($arr);
  4. // 默认按值的升序
  5. // sort($arr);
  6. // asort($arr); // key跟着一起走,而非新生成一个
  7. // print_r($arr);
  8. $arr = ['e' => 10, 'a' => 30, 'p' => 50];
  9. // print_r($arr);
  10. // ksort($arr); // 按照key排序
  11. // krsort($arr);
  12. // print_r($arr);
  13. $arr = [90, 33, 4, 10, 2, 12];
  14. // print_r($arr);
  15. // 用回调函数自定义排序,这样就可以在函数中增加一些复杂操作,例如不让某个单元出现等。
  16. usort($arr, function($a, $b){
  17. return $a - $b;
  18. });
  19. // 上面这个结果通过两个数的比较来实现排序,结果跟下面的直接sort是一样的。
  20. sort($arr);
  21. // print_r($arr);
  22. // 自然排序
  23. $arr = ['img1.jpg', 'img5.jpg', 'img10.jpg', 'img8.jpg'];
  24. print_r($arr); //这种情况下10在8前面。
  25. natsort($arr); //这种情况下则正常了。

4. 数组的切片(slice)及增删改(splice)

  1. <?php
  2. // array_slice(): 从数组中取出一部分元素
  3. $stu = ['id' => 101, 'name' => '无忌', 'age' => 20, 'course' => 'php', 'grade' => 80];
  4. // print_r($stu);
  5. // $res = array_slice($stu, 0);
  6. // $res = array_slice($stu, 0, 2);
  7. // $res = array_slice($stu, 1, 3);
  8. // $res = array_slice($stu, -3, 2); // 从-3位置开始取两个
  9. // print_r($res);
  10. // array_splice(&$arr, ....):实现增删改
  11. $arr = [10, 28, 9, 33, 56, 21, 82, 47];
  12. print_r($arr);
  13. // 从第二个位置删除两个元素。
  14. $res = array_splice($arr, 1, 2);
  15. // 返回被删除的元素组成的数组
  16. print_r($res);
  17. // 返回剩下的arr
  18. print_r($arr);
  19. // 替换(删除并替换两个元素)
  20. $res = array_splice($arr, 1, 2, [888, 999]);
  21. // print_r($res);
  22. // print_r($arr);
  23. // 新增(从第二个位置新增两个新元素)
  24. $res = array_splice($arr, 1, 0, [888, 999]);
  25. print_r($res);
  26. print_r($arr);

5. 数组的合并(array_combine)

  1. <?php
  2. $keys = ['type', 'host', 'dbname', 'username', 'password'];
  3. $values = ['mysql', 'localhost', 'phpedu', 'root', 'root'];
  4. print_r(array_combine($keys, $values));
  5. // array_merge() // 这个没展开,后面自己查询下

6. 数组的回调函数(array_filter及array_map())

  • array_filter: 对数组中的元素进行过滤
  • array_map: 针对不同的数组元素进行不同的操作
  1. <?php
  2. // 1. array_filter():只返回元素可以转为为true的元素组成的数组
  3. $arr = [150,'php', true,[4,5,6], (new class {}), [], null, false,'', 0, '0'];
  4. $res = array_filter($arr, function($item){
  5. return $item;
  6. });
  7. // [], null, false,'', 0, '0' : 转为false
  8. // 也可以简化为下面这种写法
  9. $res = array_filter($arr);
  10. // 只返回标量,数组和对象等不返回
  11. $res = array_filter($arr,function($item) {
  12. return is_scalar($item);
  13. });
  14. // print_r($res);
  15. //-----------------------------------------------
  16. // array_map():为数组中的每个元素应用指定的回调函数进行处理,并返回新数组
  17. $arr = ['php',[3,4,5], (new class {public $name='电脑';public $price=8888;}), 15, 20];
  18. // 任务:如果数组元素是对象,则输出它的属性,如果是数组,则将它转为字符串输出,否则直接输出
  19. $res = array_map(function($item){
  20. //判断当前元素是否是对象或数组
  21. switch (gettype($item)) {
  22. case 'object':
  23. $item = get_object_vars($item);
  24. $item = implode(', ', $item);
  25. // 这行及下一行(break)也可以取消掉,结果一样,但现在这种写法更容易理解
  26. break;
  27. case 'array':
  28. $item = implode(', ', $item);// 将数组转化为以,分隔得字符串。
  29. }
  30. return $item;
  31. }, $arr);
  32. print_r($res);

7. implode、extract、compact

  • implode - 数组转化为字符串;
  • extract - 关联数组转化为变量;
  • compact - 将一组变量组装成关联数组
  1. <?php
  2. $arr = ['huawei', 'xiaome', 'apple', 'oppo', 'vivo'];
  3. // implode(): 数组 --》 字符串
  4. echo implode(', ', $arr); // 转化为用,分割的数组。
  5. // extract(): 将关联数组拆分为变量
  6. $config = ['type' => 'mysql', 'host' => 'localhost', 'dbname' => 'phpedu', 'charset' => 'utf8'];
  7. // $type = 'mysql';
  8. // $host = 'localhost';
  9. // ....
  10. // $host = $config['host'];
  11. // $dbname = $config['dbname'];
  12. // $charset = $config['charset'];
  13. extract($config); // 例如针对post进来的一组输入进行操作。
  14. echo $type, $host, $dbname, $charset;
  15. // compact():将一组变量组装成关联数组
  16. $id = 1;
  17. $username = 'peter zhu';
  18. $gender = '男';
  19. print_r(compact('id','username', 'gender'));

8. 作业与实战

  • 从今晚课程中, 自己选择一些认为比较感兴趣的函数进行编程练习并提交, 不少于10个
  1. // ‘进’有两个:push(尾部进),unshift(头部进)
  2. $train=[];
  3. array_push($train,'1','2','3');
  4. array_unshift($train,'four','five','six');
  5. array_push($train,'7','8','9');
  6. array_unshift($train,'ten');
  7. print_r($train);
  8. echo '<br><hr>';
  9. // 自己的一个测试
  10. // ‘出’有两个:pop(尾部出),shift(头部出)
  11. array_pop($train);
  12. array_shift($train);
  13. array_pop($train);
  14. array_shift($train);
  15. print_r($train);
  16. echo '<br><hr>';
  17. // 应用-传统创建数组之外的另外一种方式
  18. $arr = [];
  19. array_push($arr, 'a');
  20. array_push($arr, 'b');
  21. array_push($arr, 'c');
  22. print_r($arr);
  23. echo '<br><hr>';
  24. //---- 排序
  25. asort($arr);
  26. print_r($train);
  27. echo '<br><hr>';
  28. $slice = array_slice($train, 1,2);
  29. print_r($slice);
  30. echo '<br><hr>';
  31. $addentry = array_splice($slice, 15, 0, ['bicycle', 'knift', 'plane']);
  32. //这个地方增加新元素的地方尽管写的key值很大,也是从最后一个顺位去添加。
  33. print_r($addentry);
  34. print_r($slice);
  35. echo '<br><hr>';
  36. $keys = ['type', 'host', 'dbname', 'username', 'password'];
  37. $values = ['mysql', 'localhost', 5, 3, [1,2]];
  38. $new1 = array_combine($keys, $values);
  39. $new2 = array_merge($keys, $values);
  40. print_r($new1);
  41. echo '<br>';
  42. print_r($new2);
  43. echo '<br><hr>';
  44. $new3 = array_map(function($value){
  45. switch(gettype($value)){
  46. case 'intger':
  47. $value = 0;
  48. case 'array':
  49. $value = 1;
  50. case 'string':
  51. $value = 9;
  52. }
  53. return $value;
  54. }, $new2);
  55. print_r($new3);
声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议