我有一个关联数组$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()
的 Ugly 解决方案(以及 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 />";
顺便说一句,我认为你原来的 foreach 解决方案看起来也很优雅。此外,只要阵列保持在中小型规模,就不会有明显的性能问题。
关于php - array_reduce() 不能用作 PHP 的关联数组 "reducer"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29213170/