博客列表 >0811-数组API

0811-数组API

三九三伏
三九三伏原创
2022年08月29日 13:51:32483浏览

一、 数组API

1. 遍历

直接遍历

  1. <?php
  2. namespace _0811;
  3. $stu = ['id' => 1, 'name' => 'Jack', 'course' => 'php', 'score' => 90];
  4. printf('[%s]=>%s.<br>',key($stu), current($stu));
  5. next($stu);
  6. printf('[%s]=>%s.<br>',key($stu), current($stu));
  7. next($stu);
  8. printf('[%s]=>%s.<br>',key($stu), current($stu));
  9. prev($stu);
  10. printf('[%s]=>%s.<br>',key($stu), current($stu));
  11. next($stu);
  12. printf('[%s]=>%s.<br>',key($stu), current($stu));
  13. next($stu);
  14. printf('[%s]=>%s.<br>',key($stu), current($stu));
  15. next($stu);
  16. printf('[%s]=>%s.<br>',key($stu), current($stu));
  17. // 指针指到空,prev就回不去了
  18. prev($stu);
  19. printf('[%s]=>%s.<br>',key($stu), current($stu));
  20. prev($stu);
  21. printf('[%s]=>%s.<br>',key($stu), current($stu));
  22. prev($stu);
  23. printf('[%s]=>%s.<br>',key($stu), current($stu));
  24. // 指针重置回数组第一个
  25. reset($stu);
  26. printf('[%s]=>%s.<br>',key($stu), current($stu));


循环遍历

  1. if(count($stu) > 0){
  2. while(true) {
  3. printf('[%s]=>%s.<br>', key($stu), current($stu));
  4. if(next($stu)){
  5. continue;
  6. }else{
  7. break;
  8. }
  9. }
  10. }else{
  11. echo '空数组';
  12. }
  13. echo '<hr>';
  14. //$key=key(),$value=current()
  15. foreach($stu as $key=>$value ){
  16. printf('[%s]=>%s.<br>', $key, $value);
  17. }


解构遍历

  1. echo '<hr>';
  2. // 解构
  3. // 索引数组解构
  4. list($name, $price) = ['手机', 5000];
  5. echo $name.':'.$price.'<br>';
  6. // 关联数组解构,在 PHP 7.1.0 之前的版本,list() 仅能用于数字索引的数组,并假定数字索引从 0 开始。
  7. list('name'=>$name, 'price'=>$price) = ['name'=>'电脑', 'price'=>9000];
  8. echo $name.':'.$price.'<br>';
  9. extract(['name'=>'相机', 'price'=>19000]);
  10. echo $name.':'.$price.'<br>';

foreach遍历

  1. // 用二维数组来模拟数据表查询结果
  2. $users = [
  3. ['id'=> 5, 'name'=> 'Mike'],
  4. ['id'=> 8, 'name'=> 'John'],
  5. ['id'=> 14, 'name'=> 'Jerry'],
  6. ];
  7. //foreach
  8. foreach($users as $user) {
  9. // print_r($user);
  10. vprintf('id=>%s,name=>%s.<br>', $user);
  11. }
  12. echo '<hr>';
  13. //foreach + list,更优雅一点的语法,同时还能在其中做校验等工作。
  14. foreach($users as list('id'=>$id, 'name'=>$name)) {
  15. printf('id=>%s,name=>%s.<br>', $id, $name);
  16. }

2. 值操作

array_values():将数组的值,组成一个新数组,键名会重置。
用途:数组增删改查键名混乱后重置数组。

  1. $arr = [0=>1, 2=>88, 3=>'php', 6=>[1,2,3]];
  2. printf('<pre>%s</pre>', print_r($arr,true));
  3. printf('<pre>%s</pre>', print_r(array_values($arr),true));

in_array():查询某个元素是否在这个数组中,返回布尔值。
用途:白名单查询等

  1. echo in_array('php', $arr) ? 'php在数组中' : 'php不在数组中';

array_search():类似in_array(),但返回找到的索引。

  1. $index = array_search('php', $arr);
  2. printf('index:%s, value:%s.<br>', $index, $arr[$index]);

array_unique():去重

  1. $arr = [0=>1, 1=>'php', 2=>88, 3=>'php', 6=>[1,2,3]];
  2. // printf('<pre>%s</pre>', print_r($arr,true));
  3. // 去重
  4. $new_arr = array_unique($arr);
  5. print_r($new_arr);

count() 统计成员个数

  1. echo count($arr);

array_count_values():统计每个成员的值出现的次数

  1. $arr = [0=>1, 1=>'php', 2=>88, 3=>'php', 6=>88];
  2. printf('<pre>%s</pre>.<br>', print_r(array_count_values($arr),true));

array_sum():求和

  1. $arr = [0=>1, 1=>'php', 2=>88, 3=>'php', 6=>88];
  2. // 1+0+88+0+88=177,字符串当做0值
  3. echo array_sum($arr).'<br>';
  4. $arr = [0=>1, 1=>'10php', 2=>88, 3=>'php', 6=>88];
  5. // 1+10+88+0+88=187,‘10php’字符串值10
  6. echo array_sum($arr).'<br>';

array_product():求乘积

  1. $arr = [0=>1, 1=>'1php', 2=>88, 3=>'1php', 6=>88];
  2. //字符串值为1,乘积值为7744
  3. echo array_product($arr);

3. 栈操作

栈操作:成员的增删只在数组的一端进行,本质上是增删受限的操作。

  1. // 尾部操作
  2. $arr = [1];
  3. // array_push返回数组长度。
  4. echo array_push($arr,10,20).'<br>';
  5. // 测试个写pre写法
  6. print('<pre>');
  7. print_r($arr);
  8. print('</pre>');
  9. // array_pop()返回弹出的值
  10. echo array_pop($arr).'<br>';
  11. printf('<pre>%s</pre>', print_r($arr, true));
  12. // array_pop()返回弹出的值
  13. echo array_pop($arr).'<br>';
  14. printf('<pre>%s</pre>', print_r($arr, true));

  1. // 头部操作
  2. $arr = [1];
  3. // array_unshift返回数组长度。
  4. echo array_unshift($arr,10,20).'<br>';
  5. printf('<pre>%s</pre>', print_r($arr, true));
  6. // array_shift()返回移出的值
  7. echo array_shift($arr).'<br>';
  8. printf('<pre>%s</pre>', print_r($arr, true));
  9. // array_shift()返回移出的值
  10. echo array_shift($arr).'<br>';
  11. printf('<pre>%s</pre>', print_r($arr, true));

队列操作

  1. // 尾部追加,头部删除。
  2. $arr = [1];
  3. //字符串都是布尔值的true
  4. // echo boolval('false') ? 'true' : 'false';
  5. //放个假布尔值,实际是字符串
  6. array_push($arr, 'false');
  7. printf('<pre>%s</pre>', print_r($arr, true));
  8. array_shift($arr);
  9. printf('<pre>%s</pre>', print_r($arr, true));
  10. //头部追加,尾部删除。
  11. echo '<hr>';
  12. array_unshift($arr,1);
  13. printf('<pre>%s</pre>', print_r($arr,true));
  14. array_pop($arr);
  15. printf('<pre>%s</pre>', print_r($arr,true));

4. 排序

4.1 值排序

  1. $arr = [0, '0', '1', '!', '?', -1, 1, 30, 4, 82, 15, 20, 'A', 'abc', 'hello', 2, 46];
  2. printf('<pre>%s</pre>', print_r($arr,true));
  3. // 默认升序,0值之后先排字符串后排数字,键都会重置。
  4. sort($arr);
  5. printf('<pre>%s</pre>', print_r($arr,true));

  1. // 键名不重置
  2. asort($arr);
  3. printf('<pre>%s</pre>', print_r($arr,true));

  1. // 降序 rsort()
  2. // 键名不重置
  3. arsort($arr);
  4. printf('<pre>%s</pre>', print_r($arr,true));

4.2 键排序

键排序默认升序,排序后与原数组无差别。

  1. ksort($arr);
  2. printf('<pre>%s</pre>', print_r($arr,true));

键名降序排序

  1. krsort($arr);
  2. printf('<pre>%s</pre>', print_r($arr,true));

自定义排序

  1. $arr = [90, 33, 2, 184, 24, 3];
  2. printf('<pre>%s</pre>', print_r($arr,true));
  3. usort($arr, function($a, $b){
  4. //升序
  5. return $a - $b;
  6. // 降序
  7. // return $b - $a;
  8. });
  9. printf('<pre>%s</pre>', print_r($arr,true));

每次调用随机乱序

  1. shuffle($arr);
  2. printf('<pre>%s</pre>', print_r($arr,true));

第一次刷新

第二次刷新

5. 查询替换

slice切片

  1. $stu = ['id' => 101, 'name' => '无忌', 'age' => 20, 'course' => 'php', 'grade' => 80];
  2. $res = array_slice($stu, 2, 2);
  3. printf('<pre>%s</pre>', print_r($res,true));

删除

  1. $arr = [10, 28, 9, 33, 56, 21, 82, 47];
  2. printf('原数组:<pre>%s</pre>', print_r($arr,true));
  3. $res = array_splice($arr, 1, 2);
  4. printf('删除:<pre>%s</pre>', print_r($res,true));
  5. printf('效果:<pre>%s</pre>', print_r($arr,true));

替换

  1. //最后替换内容参数可以是单值也可以是数组。
  2. $res = array_splice($arr, 1, 2, [666, 999]);
  3. printf('被替换:<pre>%s</pre>', print_r($res,true));
  4. printf('替换后:<pre>%s</pre>', print_r($arr,true));

追加

  1. //从索引1处删除0个,增加两个元素。
  2. $res = array_splice($arr, 1, 0, [666, 999]);
  3. printf('没有被删除的:<pre>%s</pre>', print_r($res,true));
  4. printf('效果:<pre>%s</pre>', print_r($arr,true));

6. 回调

6.1 array_filter()过滤

  1. $arr = [
  2. 150,
  3. 'php',
  4. true,
  5. [4, 5, 6],
  6. (new class(){
  7. }),
  8. [],
  9. null,
  10. false,
  11. '',
  12. 0,
  13. '0',
  14. ];
  15. printf('原数组:<pre>%s</pre>', print_r($arr,true));
  16. //array_filter(),默认过滤数组中为true的元素,返回新数组。
  17. $res = array_filter($arr);
  18. printf('处理后:<pre>%s</pre>', print_r($res,true));


采用回调方式效果一样

  1. $res = array_filter($arr, function ($item) {
  2. return $item;
  3. });

回调可以改变默认过滤方式,例如只返回标量/基础数据类型。

  1. $res = array_filter($arr, function ($item) {
  2. // return $item;
  3. // 只返回标量/基础数据类型
  4. return is_scalar($item);
  5. });

  1. // 再次过滤,仍是默认过滤掉空元素(非true)。
  2. printf('处理后:<pre>%s</pre>', print_r(array_filter($res),true));

6.2 array_map()

对每个成员做回调处理,返回新数组。

  1. $arr = [
  2. 'php',
  3. [4, 5, 6],
  4. (new class(){
  5. public string $name = '电脑';
  6. public int $price = 8888;
  7. }),
  8. 15,
  9. 20,
  10. ];
  11. printf('原数组:<pre>%s</pre>', print_r($arr,true));
  12. //拉平,将数组成员扁平化
  13. $res = array_map(function ($item) {
  14. switch(gettype($item)){
  15. case 'array':
  16. $item = implode(',', $item);
  17. break;
  18. case 'object':
  19. $item = implode(',', get_object_vars($item));
  20. break;
  21. }
  22. return $item;
  23. }, $arr);
  24. printf('处理后:<pre>%s</pre>', print_r($res,true));

6.3 array_reduce()

迭代简化

  1. $arr = [1, 2, 3, 4, 5, 6];
  2. // array_sum()的底层也是array_reduce()
  3. echo 'sum求和结果:'.array_sum($arr).'<br>';
  4. // array_reduce()参数1是需要简化的数组,参数2回调,参数3是从哪个值开始迭代简化。
  5. $res = array_reduce($arr, function ($acc, $cur) {
  6. echo '每轮参与计算的acc和cur:'.$acc.','.$cur.'<br>';
  7. return $acc + $cur;
  8. }, 0);
  9. echo 'reduce求和结果:'.$res;

6.4 array_walk()

使用自定义函数进行回调,返回布尔值。不常用,可以用array_map代替。

  1. $res = ['id' => 10, 'name' => 'admin', 'email' => 'admin@php.cn'];
  2. // array_walk(数组,回调,回调的第三个数组默认值)
  3. array_walk($res, function ($value, $key, $color) {
  4. printf('[%s] => <span style="color:%s">%s</span><br>', $key, $color, $value);
  5. }, 'red');

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