array_reduce() 不能用作 PHP 的关联数组“化简器”?

2022-08-30 17:05:28

我有一个关联数组,并且需要简化为一个字符串,在此上下文中$assoc

$OUT = "<row";
foreach($assoc as $k=>$v) $OUT.= " $k=\"$v\"";
$OUT.= '/>';

如何以优雅的方式做同样的事情,但使用array_reduce()


几乎相同的算法(较低的性能和较低的易读性)与功能,array_walk()

 array_walk(  $row, function(&$v,$k){$v=" $k=\"$v\"";}  );
 $OUT.= "\n\t<row". join('',array_values($row)) ."/>";

丑陋的解决方案(再次作为减速器):array_map()join()

  $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()


答案 1

首先,使用关联数组,但您没有任何机会访问回调函数中的键,只能访问值。array_reduce()

您可以使用关键字在闭包中访问 by 引用,如下面的示例所示。这将与:use$resultarray_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你原来的前置解决方案看起来也很优雅。此外,只要阵列保持在中小型大小,就不会出现明显的性能问题。


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

$OUT = join(" ", array_reduce(array_keys($array), function($as, $a) use ($array) {
    $as[] = sprintf('%s="%s"', $a, $array[$a]); return $as;
}, array()));

推荐