在这种情况下,我有一个关联数组$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解决方案也看起来很优雅。只要阵列保持中小尺寸,也不会出现重大的性能问题。