使用 'array_walk' 遍历
本课属于 Coddy PHP 学习旅程的“逻辑与流程”单元。第 44 课,共 68 课。
与 array_map() 相比,array_walk() 函数提供了另一种处理数组的方式。array_map() 会创建一个包含转换后值的新数组,而 array_walk() 会对每个元素就地应用回调函数,直接修改原数组。
当你想在不创建副本的情况下更改现有数组时,这个函数特别有用。你提供的回调函数会通过引用接收每个数组元素,因此可以直接修改原始值。
<?php
function addPrefix(&$value, $key) {
$value = "Item: " . $value;
}
$items = ["apple", "banana", "orange"];
array_walk($items, "addPrefix");
// $items 现在是:["Item: apple", "Item: banana", "Item: orange"]
?>注意,回调函数使用 &$value 通过引用接收数组元素。这样,函数就可以直接修改原数组中的元素。第二个参数 $key 可以访问当前元素的键,不过对于简单的转换来说,它并不总是必需的。
array_walk() 还支持一个可选的第三个参数,让你可以直接向回调函数传递额外的数据。当转换需要依赖数组外定义的值时,这个参数会很有用,例如前缀、后缀或其他动态输入。
当你向 array_walk() 传入第三个参数时,你的回调函数会将它作为第三个参数接收:
<?php
function addCategory(&$value, $key, $category) {
$value = $category . ": " . $value;
}
$products = ["laptop", "mouse", "keyboard"];
$prefix = "Electronics";
array_walk($products, "addCategory", $prefix);
// $products 现在是:["Electronics: laptop", "Electronics: mouse", "Electronics: keyboard"]
?>这里,$prefix 会作为第三个参数传入 array_walk(),回调函数会将它接收为 $category。这样,你就可以使用不同的前缀重复使用同一个回调函数,而不必在其中硬编码任何值。
挑战
简单你会收到两个输入:一个以逗号分隔的产品名称列表,以及一个类别前缀。第一个输入是一个字符串,格式为 laptop,mouse,keyboard,monitor;第二个输入是类别前缀文本(例如:Electronics)。
读取两个输入,将以逗号分隔的产品名称转换为数组,创建一个回调函数,按 "Category: ProductName" 的格式为每个产品名称添加类别前缀,使用 array_walk() 和你的回调函数直接修改原数组,并将修改后的每个产品名称单独打印在一行中。
你的回调函数必须使用 &$value 参数,通过引用修改数组元素。该函数应将类别前缀与冒号和空格拼接起来,后面再接产品名称。
输入格式:
- 第一行:以逗号分隔的产品名称(例如:
laptop,mouse,keyboard,monitor) - 第二行:类别前缀文本(例如:
Electronics)
预期输出:将修改后的每个产品名称单独打印在一行中,格式为 Category: ProductName
亲手试试
<?php
// 读取用逗号分隔的产品名称
$products_input = trim(fgets(STDIN));
// 读取类别前缀
$category = trim(fgets(STDIN));
// 将用逗号分隔的字符串转换为数组
$products = explode(',', $products_input);
// TODO: 在下方编写你的代码
// 创建一个回调函数,为每个产品名称添加类别前缀
// 使用 array_walk() 和你的回调函数修改数组
// 每行输出一个修改后的产品名称
foreach ($products as $product) {
echo $product . "\n";
}
?>这节课包含一个小测验。开始学习即可作答,并记录你的进度。
逻辑与流程中的所有课
自己练习: PHP 在线编译器