我有一个在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];
编辑:在foreach
或array_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);
如果您有其他键,您可以在回调中使用reset
或array_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');