博客列表 >210429 PHP 回调函数 递归函数 数组函数

210429 PHP 回调函数 递归函数 数组函数

xyphpblog
xyphpblog原创
2021年05月13日 12:04:33625浏览

1. 回调函数

  • 将一个用户自定的”执行过程”当做参数传递给到函数中,扩展该函数的功能
  • 一个函数作为参数传递到主函数中,在主线程执行的过程中,突然跳去执行设置的回调函数,回调函数执行结束后,再回到主线程处理接下来的流程

1.1 匿名函数作为参数

  1. <?php
  2. # 匿名函数作为参数
  3. $foo = function ($p1, $p2) {
  4. return $p1 + $p2;
  5. };
  6. function f1(Closure $callback)
  7. {
  8. $a = 10;
  9. $b = 8;
  10. echo "calculating $a + $b = " . $callback($a, $b) . "<hr>";
  11. }
  12. f1($foo);
  13. //calculating 10 + 8 = 18

1.2 call_user_func 回调一个全局函数

  1. //1. 系统函数回调一个全局函数
  2. function f2(string $sport): string
  3. {
  4. return "Favourite sport: $sport" . "<br>";
  5. }
  6. //call_user_func(函数名称,参数列表)
  7. echo call_user_func('f2', '?');
  8. //call_user_func_array(函数名称,[参数数组])
  9. echo call_user_func_array('f2', ['?']);

1.3 call_user_func 回调一个匿名函数

  1. //2. 回调一个匿名函数
  2. $arr = [1, 2, 3];
  3. $fooo = function (int $a, int $b, int $c) use ($arr) {
  4. array_push($arr, $a, $b, $c);
  5. return $arr;
  6. };
  7. $newArr = call_user_func_array($fooo, [4, 5, 6]);
  8. echo '<pre>';
  9. print_r($newArr);
  10. // Array
  11. // (
  12. // [0] => 1
  13. // [1] => 2
  14. // [2] => 3
  15. // [3] => 4
  16. // [4] => 5
  17. // [5] => 6
  18. // )

1.4 异步调用对象的方法

  1. //3. 异步调用对象的方法
  2. class Human
  3. {
  4. public function eat(string $food): string
  5. {
  6. return "Human eat $food" . '<br>';
  7. }
  8. public static function drink(string $drinks): string
  9. {
  10. return "Human drink $drinks" . '<br>';
  11. }
  12. }
  13. echo call_user_func([new Human, 'eat'], '?');
  14. echo call_user_func_array('Human::drink', ['☕️']);

2. 递归函数

  • 函数中自己调用自己

以下代码会将toDelete中的文件以及该文件夹依次删除

  1. function delete_dir_files($dir)
  2. {
  3. $status = false;
  4. if (is_dir($dir)) {
  5. if ($handle = opendir($dir)) {
  6. while (($file = readdir($handle)) !== false) {
  7. echo $file;
  8. if ($file != '.' && $file != '..') {
  9. if (is_dir($dir . '\\' . $file)) {
  10. delete_dir_files($dir . '\\' . $file);
  11. } else {
  12. unlink($dir . '\\' . $file);
  13. }
  14. }
  15. }
  16. }
  17. closedir($handle);
  18. if (rmdir($dir)) {
  19. $status = true;
  20. }
  21. }
  22. return $status;
  23. }
  24. $path = __DIR__ . '\\toDelete';
  25. echo $path;
  26. delete_dir_files($path);

3. 数组函数

  • 数组:有序的键值对集合

3.1 添加/删除元素

3.1.1 添加数组元素

  • 向数组头部或尾部添加元素
  1. //数组元素的增加 返回数组长度
  2. $arr = [10];
  3. //1. 头部添加
  4. echo array_unshift($arr, 1, 5); //3
  5. print_r($arr);
  6. //Array ( [0] => 1 [1] => 5 [2] => 10 )
  7. //2. 尾部添加 返回数组长度
  8. echo array_push($arr, 20, 30); //5
  9. print_r($arr);
  10. //Array ( [0] => 1 [1] => 5 [2] => 10 [3] => 20 [4] => 30 )

3.1.2 删除数组元素

  • 在头部删除元素
  • 在尾部删除元素
  • 在指定位置删除指定数量的元素
  1. //数组元素的删除
  2. //1. 头部删除 返回删除的元素
  3. $arr2 = range('a', 'g');
  4. echo array_shift($arr2); //a
  5. print_r($arr2);
  6. // Array ( [0] => b [1] => c [2] => d [3] => e [4] => f [5] => g )
  7. //2. 尾部删除 返回删除的元素
  8. echo array_pop($arr2); //g
  9. print_r($arr2);
  10. // Array ( [0] => b [1] => c [2] => d [3] => e [4] => f )
  11. echo '<br>';
  12. //任意位置删除指定数量的数组元素 返回被删除的元素组成的数组
  13. $arr3 = range(1, 10);
  14. var_dump(array_splice($arr3, 6, 5));
  15. //array(4) { [0]=> int(7) [1]=> int(8) [2]=> int(9) [3]=> int(10) }
  16. print_r($arr3);
  17. //Array ( [0] => 1 [1] => 2 [2] => 3 [3] => 4 [4] => 5 [5] => 6 )

3.2 键值对相关操作

3.2.1 获取数组的键

  1. <?php
  2. # 数组键值对相关操作
  3. $dinner = ['mon' => 'rice', 'tue' => 'noodles', 'wed' => 'chicken', 'thu' => 'burger', 'fri' => 'bbq'];
  4. //获取数组的键,返回键组成的数组
  5. $keys = array_keys($dinner);
  6. echo '<pre>';
  7. print_r($keys);
  8. // Array
  9. // (
  10. // [0] => mon
  11. // [1] => tue
  12. // [2] => wed
  13. // [3] => thu
  14. // [4] => fri
  15. // )

3.2.2 检测数组是否有指定的键或者索引

  1. //检测数组是否有指定的键或者索引
  2. var_dump(array_key_exists('sun', $dinner));
  3. //bool(false)

3.2.3 检测数组是否有指定的值

  1. //检测数组是否有指定的值 返回指定值对应的键 在if中如果返回的键为0会导致false判断
  2. echo array_search('bbq', $dinner);
  3. //fri
  4. //检测数组是否有指定的值 找到返回true/没找到返回false
  5. var_dump(in_array('rice', $dinner));
  6. //bool(true)

3.2.4 返回数组中所有的值,并重新建立索引

  1. //返回数组中所有的值,并为其建立索引
  2. $arr = array_values($dinner);
  3. echo '<pre>';
  4. print_r($arr);
  5. // Array
  6. // (
  7. // [0] => rice
  8. // [1] => noodles
  9. // [2] => chicken
  10. // [3] => burger
  11. // [4] => bbq
  12. // )

4. 常用数组回调函数

4.1 array_walk()

  • array_walk ( array &$array , callable $callback , mixed $userdata = null ) : bool
  • 关于参数callback:
    • @param callback $callback
    • Typically, funcname takes on two parameters. The array parameter’s value being the first, and the key/index second.
    • If funcname needs to be working with the actual values of the array, specify the first parameter of funcname as a reference. Then, any changes made to those elements will be made in the original array itself.
  1. $dinner = ['mon' => 'rice', 'tue' => 'noodles', 'wed' => 'chicken', 'thu' => 'burger', 'fri' => 'bbq'];
  2. //回调一个函数
  3. function testArrayWalk(&$arrItem, $key, $drink)
  4. {
  5. $arrItem .= " & $drink";
  6. }
  7. array_walk($dinner, 'testArrayWalk', 'Coca Cola');
  8. echo '<pre>';
  9. print_r($dinner);
  10. //回调匿名函数
  11. array_walk($dinner, function (&$arrItem, $key, $cola) {
  12. $arrItem .= "$cola";
  13. }, '?');
  14. echo '<pre>';
  15. print_r($dinner);

4.2 array_map()

  • array_map ( callable $callback , array $array , array …$arrays ) : array
  • array_map()回调的callback函数处理完每个数组元素后,需要return处理的元素,以被收集进array_map()最后要返回的数组
  1. $num = array_map(function ($item1, $item2) {
  2. $item1 .= $item2;
  3. return $item1;
  4. }, range(1, 3), range('a', 'c'));
  5. echo '<pre>';
  6. print_r($num);
  7. // Array
  8. // (
  9. // [0] => 1a
  10. // [1] => 2b
  11. // [2] => 3c
  12. // )

4.3 array_filter()

  • 过滤数组元素, 返回包含剩余数组元素的数组,但该数组中各元素下标不变(不会被重新排列,如0,1,2…)
  1. $filtered = array_filter(range(1, 9), function ($item) {
  2. return $item % 2 != 0;
  3. });
  4. echo '<pre>';
  5. print_r($filtered);
  6. // Array
  7. // (
  8. // [0] => 1
  9. // [2] => 3
  10. // [4] => 5
  11. // [6] => 7
  12. // [8] => 9
  13. // )
  14. echo '<pre>';
  15. print_r(array_values($filtered));
  16. // Array
  17. // (
  18. // [0] => 1
  19. // [1] => 3
  20. // [2] => 5
  21. // [3] => 7
  22. // [4] => 9
  23. // )

5. 作业

5.1

  1. /**
  2. * 作业内容:
  3. * 1. 如何将以下二维数组里的键值name换成user ,其他保持不变?
  4. * $data = [['name'=>'zhangdan','id'=>2],['name'=>'lisi','id'=>1]];
  5. */
  6. $data = [['name' => 'zhangdan', 'id' => 2], ['name' => 'lisi', 'id' => 1]];
  7. echo '<pre>';
  8. print_r($data);
  9. array_walk($data, function (&$item, $key) {
  10. //decide if the subarray of $data has keys of 'name'
  11. if (array_key_exists('name', $item)) :
  12. //get the original key array of subarray
  13. $keys = array_keys($item);
  14. //iterate the key array and replace 'name' with 'user'
  15. foreach ($keys as $key => $value) {
  16. if ($value === 'name') :
  17. $keys[$key] = 'user';
  18. endif;
  19. }
  20. endif;
  21. //combine new keys with old values
  22. $item = array_combine($keys, $item);
  23. });
  24. echo '<pre>';
  25. print_r($data);

5.2

  1. /**
  2. * 2. 生成一个由1-100组成的数组,要求返回该数组中的偶数组成的新数组,并且新数组的索引从0开始?
  3. */
  4. $filtered_arr = array_filter(range(1, 100), function ($item) {
  5. return $item % 2 == 0;
  6. });
  7. echo '<pre>';
  8. print_r(array_values($filtered_arr));

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