Menu
CoddyTech

使用 'array_reduce' 归约

本课属于 Coddy PHP 学习旅程的“逻辑与流程”单元。第 43 课,共 68 课。

array_reduce() 函数采用了与 array_map() 和 array_filter() 不同的方法。它不会返回一个新数组,而是处理数组中的所有元素,生成一个值。它非常适合计算总和、查找最大值或将所有元素合并为一个结果等操作。

该函数接收要处理的数组和一个定义如何组合元素的回调函数,还可以接收一个可选的第三个参数:初始值。回调函数接收两个参数:累积的结果(称为“carry”)和当前数组元素。

<?php
function addNumbers($carry, $item) {
    return $carry + $item;
}

$numbers = [1, 2, 3, 4, 5];
$sum = array_reduce($numbers, "addNumbers", 0);
// 结果:15
?>

在这个示例中,函数从初始值 0 开始,然后反复使用当前总和和数组中的每个元素调用 addNumbers。这个累加过程会一直进行,直到处理完所有元素,最后得到归约后的值。

challenge icon

挑战

简单

你会收到两个输入:一个由逗号分隔的数字列表,以及一种运算类型。第一个输入是一个字符串,格式为 5,10,15,20,25,第二个输入是一个字符,用于表示运算:S 表示求和,P 表示求积,M 表示求最大值。

读取这两个输入,将逗号分隔的数字转换为整数数组,创建一个自定义回调函数来执行指定的运算,然后使用 array_reduce() 和你的回调函数以及合适的初始值,将所有数字处理为一个结果,并输出最终结果。

运算说明:

  • S(求和):将所有数字相加(初始值:0)
  • P(求积):将所有数字相乘(初始值:1)
  • M(求最大值):找出最大的数字(初始值:数组中的第一个数字或一个非常小的数字)

你的回调函数应接受两个参数:累积结果(carry)和当前数组元素(item),然后根据运算类型返回更新后的累积值。

输入格式:

  • 第一行:逗号分隔的数字(示例:5,10,15,20,25)
  • 第二行:运算类型,可以是 S、P 或 M(示例:S)

预期输出:一个表示 reduce 运算结果的数字

亲手试试

<?php
// 读取输入
$numbers_input = trim(fgets(STDIN));
$operation = trim(fgets(STDIN));

// 将以逗号分隔的字符串转换为整数数组
$numbers = array_map('intval', explode(',', $numbers_input));

// TODO:在下方编写你的代码
// 根据运算类型创建回调函数
// 使用 array_reduce(),传入你的回调函数和合适的初始值


// 输出结果
echo $result;
?>
quiz icon自我测试

这节课包含一个小测验。开始学习即可作答,并记录你的进度。

逻辑与流程中的所有课

自己练习: PHP 在线编译器