在PHP中,是否有一个数组函数与下面的代码做同样的事情?我想知道是否有可能使用array_map
或array_reduce
这样的方式,以便事先不需要声明$items
数组。
$data = [
['order_product_id' => 123, 'quantity' => 1],
['order_product_id' => 456, 'quantity' => 2],
['order_product_id' => 567, 'quantity' => 3],
];
$items = [];
foreach ($data as $item) {
$items[$item->order_product_id] = ['quantity' => $item->quantity];
}
print_r($items);
/*
Array
(
[123] => ['quantity' => 1]
[456] => ['quantity' => 2]
[789] => ['quantity' => 3]
)
*/
答案 0 :(得分:4)
您可以使用array_map执行此操作:
<?php
$data = [
['order_product_id' => 123, 'quantity' => 1],
['order_product_id' => 456, 'quantity' => 2],
['order_product_id' => 567, 'quantity' => 3],
];
$items = [];
array_map(function ($item) use (&$items) {
$items[$item['order_product_id']] = ['quantity' => $item['quantity']];
}, $data);
您也可以使用两个array_map调用来执行此操作:
$keys = array_map(function ($item) {
return $item['order_product_id'];
}, $data);
$values = array_map(function ($item) {
return ['quantity' => $item['quantity']];
}, $data);
$items = array_combine($keys, $values);
或者如果您不想声明任何临时变量:
$items = array_combine(
array_map(function ($item) {
return $item['order_product_id'];
}, $data),
array_map(function ($item) {
return ['quantity' => $item['quantity']];
}, $data)
);
它们都不如foreach
有效。
答案 1 :(得分:0)
Array_reduce将执行您想要的操作,因为它隐藏了输出数组在&#39;初始值&#39;中的声明。 &#39;携带&#39;或者&#39;累加器&#39;参数。而且,而不是减少&#39;它实际上会在输出中添加条目。
imo,将carry
的{{1}}参数视为callback
会更有用。在这种情况下,&#39;累加器&#39;是一个数组,我们正在添加条目。
imo,它不像原始版本那么容易理解。并没有更快。
accumulator
输出:
$data = [
(object) ['order_product_id' => 123, 'quantity' => 1],
(object) ['order_product_id' => 456, 'quantity' => 2],
(object) ['order_product_id' => 567, 'quantity' => 3],
];
$items = array_reduce($data,
function ($out, $item) {
$out[$item->order_product_id] = ['quantity' => $item->quantity];
return $out;
},
array());
print_r($items);