PHP阵列降低功能
#初学者 #编程 #php #数组

目录

关于阵列减少

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和一个空数组作为初始值。我们只需要编写回调。

然后,在回调中:

  1. 由于$item是一个键值对([“名称” =>“ product 1”,“ PRISE” => 10])为简单起见,我们将名称及其价格分配给变量。

  2. 我们检查项目是否在数组中($ 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