目录
关于阵列减少
array_reduce
是一个数组函数,通过将回调函数应用于数组中的元素。
array_reduce(
array $array,
callable $callback,
mixed $initial = null
): mixed
它采用以下参数:
- 一个数组(我们要减少什么),
- 回调(逻辑),
- 初始值(例如,一个空数组[])。
简单示例:
让我们在数组中找到唯一的值。
1.我们有一系列产品
// an array
$products = [
"shirt",
"shoes",
"shirt"
];
2.回调函数,该功能检查项目是否已经在数组中。
$reducer = function ($all, $item) {
if (!in_array($item, $all)) {
array_push($all, $item);
}
return $all;
};
- 变量
$item
拥有$products.
当前迭代的值 - 可变
$all
保留上一个迭代的返回值。它的初始值定义为array_reduce.
中的最后一个参数
3.初始值
由于我们在回调中返回数组,因此该类型必须匹配初始数组(我们将空数组定义为初始值)。
$initial = [];
array_reduce()
$products = [
"shirt",
"shoes",
"shirt"
];
$reducer = function ($all, $item) {
if (!in_array($item, $all)) {
array_push($all, $item);
}
return $all;
};
$initial = [];
array_reduce($products, $reducer, $initial);
// this will return
// [
// "shirt",
// "shoes",
// ]
如果我们传递了一些初始值
array_reduce($products, $reducer, ["hat"]);
// this will return
// [
// "hat",
// "shirt",
// "shoes",
// ]
另外,所有地方都在一个地方:
array_reduce(
["shirt", "shoes", "shirt"], // an array to reduce
function ($all, $item) { // callback
if (!in_array($item, $all)) {
array_push($all, $item);
}
return $all;
},
[] // initial
);
显然,我们可以使用array_unique($products)
在此示例中实现相同的结果。
实际示例:
假设我们有一系列产品(关键,价值结构)。
$products = [
["name" => "Product 1", "price" => 10],
["name" => "Product 1", "price" => 10],
["name" => "Product 1", "price" => 10],
["name" => "Product 2", "price" => 2],
["name" => "Product 3", "price" => 7],
["name" => "Product 2", "price" => 2],
];
我们需要创建一个数组,其中我们计算相同的产品($quantity
)并将其价格($total
)总结为:
[
"Product 1" => [
"total" => ...,
"quantity" => ...,
],
"Product 2" => [
"total" => ...,
"quantity" => ...,
],
...
]
我们可以使用array_reduce函数:
array_reduce($products, $reducer, []);
我们将$products
和一个空数组作为初始值。我们只需要编写回调。
然后,在回调中:
-
由于
$item
是一个键值对([“名称” =>“ product 1”,“ PRISE” => 10])为简单起见,我们将名称及其价格分配给变量。 -
我们检查项目是否在数组中($ all):
- 如果有相同密钥的一个,我们将其数量增加1并添加价格。
- 如果没有,我们将项目推到$全部,并将其数量设置为1。
$products = [
["name" => "Product 1", "price" => 10],
["name" => "Product 1", "price" => 10],
["name" => "Product 1", "price" => 10],
["name" => "Product 2", "price" => 2],
["name" => "Product 3", "price" => 7],
["name" => "Product 2", "price" => 2],
];
$reducer = function ($all, $item) {
$name = $item["name"];
$price = $item["price"];
if (isset($all[$name])) {
$all[$name]["quantity"]++;
$all[$name]["total"] += $price;
} else {
$all[$name]["total"] = $price;
$all[$name]["quantity"] = 1;
}
return $all;
};
array_reduce($products, $reducer, []);
// and that will return:
// [
// "Product 1" => [
// "total" => 30,
// "quantity" => 3,
// ],
// "Product 2" => [
// "total" => 4,
// "quantity" => 2,
// ],
// "Product 3" => [
// "total" => 7,
// "quantity" => 1,
// ],
// ]
尝试代码:
https://replit.com/@stafura/arrayreduce-in-PHP#main.php
用例:
有很多方法可以使用array_reduce函数,例如:
- 总结数组的所有元素,
- 嵌套阵列扁平,
- 根据某些标准对元素进行分组,
- 计算数组中项目的出现,
- 根据某种条件过滤数组。
更多信息:
https://www.php.net/manual/en/function.array-reduce.php