如何访问array_reduce中的当前索引?

rob*_*rob 6 php

阅读了这篇SO post 后,在 PHP 中,我知道您可以通过以下方式index进行迭代array_map

array_map(function($item, $index) { ... }, $items, array_keys($items));
Run Code Online (Sandbox Code Playgroud)

使用时如何获得$index可用的资源array_reduce?我试过了:

array_reduce($items, array_keys($items), function($acc, $item, $index) { ... }, array());

array_reduce($items, function($acc, $item, $index) { ... }, array(), array_keys($items));
Run Code Online (Sandbox Code Playgroud)

但我似乎仍不能得到$indexarray_reduce。有没有人成功地做到过这一点?

编辑

这里有一些关于我为什么问这个问题的背景。

我不想使用,foreach因为我必须改变外部的数组foreach才能创建我的集合。我宁愿避免突变。

其他语言允许人们reduce像在JavaScriptRuby 中一样使用和访问当前索引。我希望在 PHP 中获得相同的功能。那好吧!看起来我将不得不使用 aforeach来创建我的数组,同时还要在迭代下使用当前索引。

小智 6

我只是有同样的问题。解决起来非常简单。

$i = 0;
$p = array_reduce($array, function($output, $item) use (&$i) {
   // use $i
   // do something with $item and/or $output
   $i++; // increment $i
   return $output;
}, $initial);
Run Code Online (Sandbox Code Playgroud)

&$i$i作为参考传递并授予它将被更新。

  • 这是可行的,但是在回调之外改变状态是脆弱的、不优雅的,这正是我们试图通过像“array_reduce”这样的函数来避免的问题。最好只使用带有索引的“foreach”,而不是尝试将“array_reduce”硬塞到它不是的东西中。 (4认同)

Pet*_*ton 0

您所知道的获取索引的信息array_reduce并不存在。检查文档。

问题是为什么

看,reduce 的目的是得到一个单一的值,它是聚合。您有初始值和下一个值,显示您的减少策略。知道当前项目索引是没有意义的。

在其他一些语言中,它们可能会提供当前索引,但在 PHP 中则不然array_reduce。它的语言和功能是设计好的,在实现上有一些限制。

但这并不意味着你不能拥有它。你可以拥有它,但不能通过回调!

$i = 0;
$data = [1, 2, 3, 4];

// (1) 
$result = array_reduce($data, function ($c, $i) { return $c + $i; }, 0);

// (2)
array_reduce($data, function ($c, $i) { echo "$i\n"; $i++; return $c + $i; }, 0);
Run Code Online (Sandbox Code Playgroud)

问题是,这个函数就是为了做到这一点而设计的。或者您尝试使用错误的函数。其他一些功能可能正是您正在寻找的。

或者你也可以编写一个函数来完成它:)

  • 在我最初的问题中,我提供了一些关于原因的背景信息。希望这能让我明白为什么我要问这个问题。 (2认同)