php - 缓冲递归 foreach 循环输出的函数式编程替代方案

标签 php arrays optimization functional-programming

我想转换一个关联数组$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/

相关文章:

php - 来自 Foreach 循环的堆叠/重叠图像

php - 导航位置固定在滚动 wordpress 上

php - 在网站中包含 Facebook 个人资料 Feed

php - 使用正确查询时未显示数据

php - 遍历 PHP 数组中的所有项目和子项目

java - 在 Java 中寻找 BufferedInputStream 的最佳大小

c# - 在不使用数组的情况下,我可以更快地查看特定索引吗?

c - 在 C 中声明一个大小为 26^5 的 5d 数组

c++ - 确定合并排序中边数组的大小

c++ - 某些阵列大小的性能下降