【问题标题】:A better way to flatten an array in PHP在 PHP 中展平数组的更好方法
【发布时间】:2015-06-16 16:05:24
【问题描述】:

我需要维护数组键,并在键上附加一个数字,以便在展平数组时使其唯一。

示例输入:

$array = array(
    array("name"=>"bob", "age"=>32, "third_param"=>"something"),
    array("name"=>"ted", "age"=>57, "third_param"=>"something else"),
    array("name"=>"ned", "age"=>103, "third_param"=>"another something"),
);

需要的输出:

$array = array(
    "name-1"=>"bob", 
    "age-1"=>32, 
    "third_param-1"=>"something",
    "name-2"=>"ted", 
    "age-2"=>57, 
    "third_param-2"=>"something else",
    "name-3"=>"ned",
    "age-3"=>103, 
    "third_param-3"=>"another something"
);

我能够弄清楚如何做到这一点,但我的解决方案缓慢而混乱。一定有更好的方法。

这是我当前的功能:

function flatten_array($array, $flat = array()) {
    foreach($array as $k=>$v){
        $k = strval($k);
        if(!is_array($v)){
            $i = 0;
            while(true){
                $i++;
                $key = $k."-".strval($i);
                if(!isset($flat[$key])) break;
            }
            $flat[$key] = $v;
        }else{
            $flat = flatten_array($v, $flat);
        }
    }
    return $flat;
}

这是一个示例用法:http://3v4l.org/6QVj0/ (点击执行按钮,然后查看“性能”选项卡。

这需要很长时间并且在我对真实数据进行测试时超时,但是它确实产生了我需要的结果。我该怎么做才能让它更快而不占用太多内存?

【问题讨论】:

  • 无论您在做什么,我 99% 都认为原始阵列更好。也许扩展您想要更改它的原因。
  • 当然。我正在研究一个从 HTML 表或 CSV 格式的数据库构建报告的类。一些文件包含不明确的 JSON 数据。为了使 JSON 在表格或 CSV 中易于阅读,我需要将其展平。我已经弄清楚了那部分。
  • @AbraCadaver 你还有 99% 的把握吗?
  • 不,现在我 100% 确定了。
  • @AbraCadaver 详细说明。你会怎么做?

标签: php arrays recursion multidimensional-array flatten


【解决方案1】:
$ar = array();

foreach ($array as $i => $items) {
   foreach ($items as $key => $value) {     
      $ar[$key.'-'.($i+1)] = $value;
   } 
}

【讨论】:

  • 它工作得很好,比我的短得多,但性能提升不大。希望获得绿色的所有性能参数。 3v4l.org/vR1fE/perf#tabs
  • 如果数组超过 2 维,这不起作用。我的数组通常会超过 2 维。 3v4l.org/C1JWk
  • 在这种情况下递归会很快工作,但我不擅长递归。我尽量保持简单。
猜你喜欢
  • 2012-02-27
  • 2015-12-11
  • 2021-11-15
  • 2011-02-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-28
  • 2014-05-21
相关资源
最近更新 更多