博客列表 >php数组查询替换,排序,栈与队列,迭代

php数组查询替换,排序,栈与队列,迭代

阿心
阿心原创
2020年04月28日 16:15:16797浏览

数组统计

  1. <?php
  2. //count统计数组成员数量(count不单可以统计数组,还可以统计很多东西)
  3. $arr=[1,2,3,4,5,6,7,8,9,1,1];
  4. echo count($arr);
  5. // for($i=0;$i<=count($arr);$i++){
  6. // echo ($i+1),'<br>';
  7. // }
  8. echo '<hr>';
  9. //array_count_values — 统计数组中所有的值出现的次数(听其名知其意‘数组_统计_值’)
  10. printf('<pre>%s</pre>',print_r(array_count_values($arr),true));
  11. //结果为1值=3次
  12. //如果需要进行数组计算,下面出现两个字符串,php7将解析为0.
  13. $arr=[1,2,3,'php7','7php',5,8];
  14. //array_sum为数组相加求和
  15. //array_product为数组相乘求积
  16. echo array_sum($arr).'===='.array_product($arr);

栈与队列

  1. <?php
  2. // 栈与队列
  3. // 栈: 后进先出, 最后进入的最先出来, LIFO, 添加与删除受限,只允许在一端进行
  4. // 队列: 先进先出, 最先插入的数据最先出来, FIFO, 添加与删除允许在二端进行
  5. //1,栈:尾部添加/删除
  6. $i='php';
  7. $v=[66,55,33];
  8. $stack=['name','email'];
  9. //array_push — 将一个或多个单元压入数组的末尾(入栈)
  10. array_push($stack,$i,$v);//后添加后打印
  11. printf('<pre>%s</pre>',print_r($stack,true));
  12. //array_pop返回出栈的元素
  13. //array_pop — 将数组最后一个单元弹出(出栈)
  14. //简单的说就是把最后条添加的数组给删掉。
  15. array_pop($stack);
  16. //结果是$v不会被打印出来
  17. printf('<pre>%s</pre>',print_r($stack,true));
  18. echo '<hr>';
  19. //2,栈:头部删除/修改
  20. //array_unshift — 在数组开头插入一个或多个单元
  21. //原理同上,只是位置发生了变化。
  22. array_unshift($stack,$i,$v);//后添加先打印
  23. printf('<pre>%s</pre>',print_r($stack,true));
  24. //返回元素array_shift(同上返回一样)
  25. array_shift($stack);
  26. printf('<pre>%s<pre>',print_r($stack,true));
  27. echo '<hr>';
  28. //队列操作(就是栈操作的结合)
  29. //尾进+头出(array_push + array_shift)
  30. //这里需要注意的是:添加的东西按顺序排列
  31. $i='name';
  32. $v='NET2.0';
  33. $queue=['php',100];
  34. array_push($queue,$i,$v);
  35. //需要输出则是一个一个echo输出
  36. echo array_shift($queue);
  37. //printf('<pre>%s</pre>',print_r($queue,true));
  38. echo '<br>';
  39. //头进 + 尾出 (array_pop + array_unshift)原理同上。只是换了位置
  40. array_unshift($queue,$i,$v);
  41. echo array_pop($queue);

排序

  1. <?php
  2. //排序
  3. $arr=[10,20,'PHP','100','百度',10=>'html',30,'7php','7html','NET2'];
  4. //先打印原看看他的数组
  5. printf('<pre>%s</pre>',print_r($arr,true));
  6. //开始:
  7. //1,升序(说明:从小排到大。如果出现字符串和数字同时出现,会先排字符串,原因是字符串解析成数字是0.同时重置“键”的值)
  8. //sort — 对数组排序(重置索引)
  9. sort($arr);
  10. printf('<pre>%s</pre>',print_r($arr,true));
  11. $arr=[10,20,'PHP','100','百度',10=>'html',30,'7php','7html','NET2'];
  12. //asort();(索引不变)!a=asoc
  13. asort($arr);
  14. printf('<pre>%s</pre>',print_r($arr,true));
  15. echo '<hr>';
  16. //2,降序(原理同上取反)
  17. rsort($arr);//重置索引
  18. arsort($arr);//索引不变
  19. echo '<p>键名排序</p>';
  20. //键名排序
  21. $arr=[7=>10,20,'PHP','100','百度',10=>'html',30,'7php','7html',3=>'NET2'];
  22. //ksort — 对数组按照键名排序(键名升序)
  23. ksort($arr);
  24. printf('<pre>%s</pre>',print_r($arr,true));
  25. //krsort 降序
  26. krsort($arr);
  27. printf('<pre>%s</pre>',print_r($arr,true));
  28. echo '<p>自定义值升序排序</p>';
  29. //usort — 使用用户自定义的比较函数对数组中的值进行排序
  30. $arr=[10,2,0,50,100,1.2];
  31. usort($arr,function($a,$b){
  32. //$a-$b表示,需要在数组中的“值”两个两个取出来进行运算。如果遇到非数字,则报错。
  33. //注意:运算符是“-”
  34. return $a-$b;
  35. });
  36. printf('<pre>%s</pre>',print_r($arr,true));
  37. echo '<p>自定义值降序</p>';
  38. //自定义降序只需要把取出来的两个值对调过来运算即可。
  39. usort($arr,function($a,$b){
  40. return $b-$a;
  41. });
  42. printf('<pre>%s</pre>',print_r($arr,true));
  43. echo '<hr>';
  44. echo '<p>自然升序排序</p>';
  45. $arr=[10,2,0,'img31.png',50,'img22.png',100,1.2];
  46. natsort($arr);
  47. //也是由数组的值进行排序的(索引不变)
  48. var_dump($arr);//打印结果
  49. printf('<pre>%s</pre>',print_r($arr,true));
  50. echo '<p>乱序(随机排序)</p>';
  51. //shuffle — 将数组打乱
  52. //索引重置,值随机排序
  53. shuffle($arr);
  54. printf('<pre>%s</pre>',print_r($arr,true));
  55. echo '<hr>';
  56. echo '<p>键和值交换排序</p>';
  57. //array_flip — 交换数组中的键和值
  58. //注意:array_flip():只能翻转字符串和整数值!
  59. $arr=[10=>1,30=>2,'name'=>'admin','email'=>'123qq.com'];//这样做是有问题的。因为类型没有统一
  60. // $arr=['name'=>'user','email'=>'123qq.com'];//没问题
  61. // $arr=['id'=>'y','total'=>'e'];
  62. //注意下面应该是$arr=@array_flip()而不是跟上面那样直接写了。
  63. $arr=@array_flip($arr);
  64. printf('<pre>%s</pre>',print_r($arr,true));

数组查询与替换

  1. <?php
  2. //数组查询与替换
  3. //array_slice — 从数组中取出一段
  4. //支持正数和负数。正数就是从左到右,负数就从右到左
  5. $arr=['id'=>10,'account'=>'admin','name'=>'管理员','password'=>'123456','qq'=>'123456','tel'=>'10010'];
  6. $res=array_slice($arr,0,2);
  7. //(1,-1)表示,从索引1开始取,去除右边的-1个索引的数值
  8. $res1=array_slice($arr,1,-1);
  9. //(-3,3)表示:从右边-3的索引开始取数组,取3位。
  10. $res2=array_slice($arr,-3,3);
  11. //echo $res,$res1;
  12. $arr1=print_r($res,true);
  13. $arr2=print_r($res1,true);
  14. $arr3=print_r($res2,true);
  15. //删除,替换,添加数组成员array_splice()同样支持负数
  16. //删除
  17. $delete=array_splice($arr,-2,1);
  18. $delete1=print_r($delete,true);//输出被删除元素。
  19. //$delete1=print_r($arr,true);//除了别删除元素,其他输出
  20. //删除替换。。可以删除多个只替换一个。也是可以的
  21. $replace=array_splice($arr,1,3,['super','超级管理员']);
  22. $replace1=print_r($arr,true);
  23. //添加($arr,索引位置,0:表示,不删除。['xx'=>xx]:表示从索引几的位置开始添加需要数据
  24. $add=array_splice($arr,-2,0,['email'=>'123qq.com']);
  25. $add1=print_r($arr,true);
  26. printf('<pre>%s%s%s<p>删除,替换,添加数组</p>%s%s%s</pre>',$arr1,$arr2,$arr3,$delete1,$replace1,$add1);
  27. echo '<hr>';

数组元素回调处理

  1. <?php
  2. //数组元素回调处理(注意不能留空:就是不能有空格键,否则报错)
  3. $arr=[10,'id'=>20,false,null,(new class{}),0,'','0',true];
  4. //array_filter — 用回调函数过滤数组中的单元
  5. //表示:过滤掉空数组,留下有值的数组
  6. //php自动转为false的值: null, false, 空数组, 空字符串, 0, '0'
  7. //可以这样写:
  8. //$res=array_filter($arr,function($item){
  9. // return $item;
  10. // });
  11. //这样简写:
  12. $res=array_filter($arr);
  13. //echo $res;
  14. $res1=print_r($res,true);
  15. //如果需要返回标量:
  16. //is_scalar — 检测变量是否是一个标量
  17. //标量:单值变量。数组和对象都不是单值变量
  18. $scalar=array_filter($arr,function($item){
  19. return is_scalar($item);
  20. });
  21. $scalar1=print_r($scalar,true);
  22. printf('<pre>%s<p>返回标量</p>%s</pre>',$res1,$scalar1);
  23. echo '<hr>';
  24. $arr=['name',20,[1,2,3],(new class{public $Bname='小米';public $Price=3000;}),'purch'=>'立即购买'];
  25. ////array_map — 将回调函数作用到给定数组的单元上
  26. $res=array_map(function($item){
  27. //拉平数组$item接受数据。gettype获取变量类型
  28. switch(gettype($item)){
  29. //get_object_vars — 返回由对象属性组成的关联数组
  30. case 'object':
  31. $item=get_object_vars($item);
  32. //implode — 将一个一维数组的值转化为字符串
  33. case 'array':
  34. $item=implode($item);
  35. }
  36. return $item;
  37. },$arr);
  38. printf('<pre>%s</pre>',print_r($res,true));
  39. echo '<hr>';
  40. //array_map()同时处理多个数组
  41. $key=['host','root','password','db'];
  42. $val=['localhost','root','1231456','baidu'];
  43. //array_combine — 创建一个数组,用一个数组的值作为其键名,另一个数组的值作为其值
  44. $res =array_combine($key,$val);
  45. //echo $res;
  46. //$res1=print_r($res,true);
  47. printf('<pre>%s</pre>',print_r($res,true));
  48. echo '<hr>';
  49. $res=array_map(function($val1,$val2){
  50. return [$val1=>$val2];
  51. },$key,$val);
  52. printf('<pre>%s</pre>',print_r($res,true));
  53. echo $res[2]['password'];
  54. echo '<hr>';
  55. //array_reduce — 用回调函数迭代地将数组简化为单一的值
  56. $res=array_reduce($res,function($prev,$current){
  57. //获取当前元素“键”
  58. $key=key($current);
  59. //获取“值”
  60. $val=current($current);
  61. //键和值拼装
  62. $prev[$key]=$val;
  63. return $prev;
  64. });
  65. printf('<pre>%s</pre>',print_r($res,true));

总结:上面的函数回调还能免强有点感觉,迭代这里完全搞不懂,一点都没看懂。

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