在PHP中展平数组的更好方法

时间:2015-04-10 20:08:13

标签: php arrays recursion multidimensional-array flatten

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

示例输入:

$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/ (点击执行按钮,然后查看“性能”标签。

这需要很长时间,并且在对真实数据进行测试时已经超时,但它确实产生了我需要的结果。我能做些什么来加快速度,不占用太多内存?

1 个答案:

答案 0 :(得分:3)

$ ar = array();

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