如何在php 8中使用array_map和reset回调



我有一个在php 7中工作良好的函数,但在php 8.0.11有警告

$orders->result = array_map('reset', $orders->result);
E_WARNING: reset(): Argument #1 ($array) must be passed by reference, value given in

当然,我可以用这段代码来代替但可能比array_map

foreach ($orders->result as $item)
$result[$item[0]['order_id']] = $item[0];

编辑:foreacharray_map之前,输出如下

Array
(
[0] => Array
(
[order_id] => 41111909
[shop_id] => 34277
[user_id] => 42363
[status_id] => 4
)
)

使用foreach输出后如下

Array
(
[41111909] => Array
(
[order_id] => 41111909
[shop_id] => 34277
[user_id] => 42363
[status_id] => 4
)
)

如何解决?

最简单的替代方法是创建一个箭头函数(单表达式闭包)来为您获取该元素。

如果数组是普通列表,那么您总是获得元素0,这就像:

$orders->result = array_map(fn($item) => $item[0], $orders->result);

在这种情况下,另一种选择是array_column:

$orders->result = array_colum($orders->result, 0);

如果您有其他键,您可以在回调中使用resetarray_key_first来代替:

$orders->result = array_map(fn($item) => $item[array_key_first($item)], $orders->result);

(我怀疑array_key_first会更有效一些,因为它不需要操作内部数组指针。)

您想要做什么并不完全清楚,但似乎您正在尝试从嵌套数组中获取第一个值。你应该能够使用一个函数:

$orders->result = array_map(function($v) { return reset($v); }, $orders->result);

你也可以尝试使用current,如果它做你需要的,因为它不接受引用,数组指针应该已经被array_map重置:

$orders->result = array_map('current', $orders->result);

编辑后,所讨论的代码不会像之前和之后所示的那样重新索引数组。这很简单:

$orders->result = array_column($orders->result, null, 'order_id');

最新更新