在这种情况下,我有一个关联数组$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)) ."/>";

带有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()与关联数组一起使用,但是您没有任何机会访问回调函数中的键,仅访问值。
您可以使用use关键字通过闭包中的引用来访问$result,如以下示例中的array_walk()所示。这将非常类似于array_reduce():

$array = array(
    'foo' => 'bar',
    'hello' => 'world'
);

// Inject reference to `$result` into closure scope.
// $result will get initialized on its first usage.
array_walk($array, function($val, $key) use(&$result) {
    $result .= " $key=\"$val\"";
});
echo "<row$result />";
顺便说一句,imo您原始的foreach解决方案也看起来很优雅。只要阵列保持中小尺寸,也不会出现重大的性能问题。

10-06 12:01