我想转换一个关联数组$a = array("key0"=> array("key1"=> "val0", "key2"=> "val1"), "key3"=> "val2")
转换为字符串 $s = "key0.key1=val0&key0.key2=val1&key3=val2&
所以我目前正在做的是..
function assoc_to_str($var, $acc = array()){
if(is_array($var)){
foreach($var as $key => $val){
assoc_to_str($val, array_merge($acc, array($key)));
}
}else{echo join('.',$acc).'='.$var.'&';}
}
function assoc_to_str_buffer($arr){
ob_start();
arr_to_str($arr);
return ob_get_clean();
}
..并调用assoc_to_str_buffer()
。现在,这感觉很尴尬,而且我猜它也不是很有效率?函数式风格有更好的方法吗?
如果输出不是连续的字符串,而是 foreach 循环当前返回的数组,也没关系。
最佳答案
解决方案通过array_map()
.
function tree_to_str(array $array, $prefix = '')
{
return join('&', array_map(function ($key, $value) use ($prefix)
{
if (is_array($value)) {
return tree_to_str($value, $prefix.$key.'.');
} else {
return $prefix.$key.'='.$value;
}
}, array_keys($array), $array));
}
更多“势在必行”的解决方案:
function tree_to_str(array $array, $prefix = '')
{
$buffer = [];
foreach ($array as $key => $value) {
if (is_array($value)) {
$buffer[] = tree_to_str($value, $prefix.$key.'.');
} else {
$buffer[] = $prefix.$key.'='.$value;
}
}
return join('&', $buffer);
}
关于php - 缓冲递归 foreach 循环输出的函数式编程替代方案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41181660/