PHP中是否有一个数组函数来代替foreach循环?

时间:2016-10-26 00:43:16

标签: php arrays

在PHP中,是否有一个数组函数与下面的代码做同样的事情?我想知道是否有可能使用array_maparray_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]
)
*/

2 个答案:

答案 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);