Blogger Information
Blog 18
fans 0
comment 0
visits 11019
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
210429 PHP 回调函数 递归函数 数组函数
xyphpblog
Original
624 people have browsed it

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));

Correcting teacher:灭绝师太灭绝师太

Correction status:qualified

Teacher's comments:
Statement of this Website
The copyright of this blog article belongs to the blogger. Please specify the address when reprinting! If there is any infringement or violation of the law, please contact admin@php.cn Report processing!
All comments Speak rationally on civilized internet, please comply with News Comment Service Agreement
0 comments