【发布时间】:2015-05-26 14:46:15
【问题描述】:
我有一个关联数组$assoc,在这种情况下需要将其简化为字符串
$OUT = "<row";
foreach($assoc as $k=>$v) $OUT.= " $k=\"$v\"";
$OUT.= '/>';
如何做in an elegant way同样的事情,但使用array_reduce()
与array_walk() 函数接近相同的算法(性能较低且易读性较低),
array_walk( $row, function(&$v,$k){$v=" $k=\"$v\"";} );
$OUT.= "\n\t<row". join('',array_values($row)) ."/>";
Ugly 解决方案,使用 array_map()(再次将 join() 作为 reducer):
$row2 = array_map(
function($a,$b){return array(" $a=\"$b\"",1);},
array_keys($row),
array_values($row)
); // or
$OUT ="<row ". join('',array_column($row2,0)) ."/>";
PS:显然 PHP 的 array_reduce() 不支持关联数组(为什么??)。
【问题讨论】:
-
array_reduce() 不在乎您的数组是关联的还是枚举的,甚至是混合的,所以不要传播 FUD ......或者提供一个失败的真实例子......请注意,回调是纯粹的值,这是记录在案的行为,这与不支持关联数组不同
-
@MarkBaker 是的,该函数对“无法访问当前值的当前索引”是诚实的......而其他语言(like Python)对 reduce( )... 最好将 reduce() 第一个参数视为 traversable(不是数组),其中只有 current/next 是已知的。
-
这不是 FUD。它的措辞可能很糟糕,但 array_reduce 不正确或完全不支持关联数组。它仅部分支持它们,将它们视为非关联的。 PHP 的非关联数组的实现实际上是一个关联数组,但是由于您丢弃了 array_reduce 上的键,因此当您需要一个关联数组时它并没有多大用处。这就是重点。
-
结论:上面的
foreach解决方案是最好的解决方案。更快,最简单(如此优雅)......并且对于 PHP 中的此类问题,没有(功能性)优雅的方式来使用array_reduce。 -
PS:另见this discusstion about reduce function in Python 和避免reduce 和lambda 的一般解决方案list comprehension。
标签: php mapreduce associative-array