在PHP中简化多维数组

时间:2015-11-24 08:12:56

标签: php arrays multidimensional-array

我收到了XML并将其转换为数组以供使用。 当我将其转换为数组时,XML具有不可预测的多维度。 一直在环顾四周,但找不到合适的解决方案。 另一种方法是简化转换后的数组。

我已经在PHP中将XML转换为数组,结果如下所示:

Array
(
    [GetMLCBRes] => Array
        (
            [0] => Array
                (
                    [Ord] => Array
                        (
                            [0] => Array
                                (
                                    [OrdId] => Array
                                        (
                                            [0] => DP Order ID
                                        )
                                )
                        )
                    [ReqInf] => Array
                        (
                            [0] => Array
                                (
                                    [ReqDat] => Array
                                        (
                                            [0] => Date of Request
                                        )
                                )
                        )
                    [Res] => Array
                        (
                            [0] => PDF Report
                        )
                )
        )
)

我是否知道如何删除像[0]这样的索引,但仍保留像[Ord],[OrdId],[ReqInf]和[Res]等关联键。

如何将其转换为这样?

Array
(
    [GetMLCBRes] => Array
        (
            [Ord] => Array
                (
                    [OrdId] => DP Order ID
                )
           [ReqInf] => Array
                (
                    [ReqDat] => Date of Request
                )
            [Res] => PDF Report
        )
)

谢谢。

2 个答案:

答案 0 :(得分:1)

它可以工作,但如果你改变你的结构,也许它不会。它也没有优化:)

$input = Array(
    'GetMLCBRes' => Array(Array(
        'Ord' => Array(Array(
                        'OrdId' => Array('DP Order ID')
        )),
        'ReqInf' => Array(Array(
                        'ReqDat' => Array('Date of Request')
        )),
        'Res' => Array('PDF Report')
    ))
);

foreach($input as &$in){
    $sub = $in[0];
    foreach($sub as $key => &$value){
        $sub2 = $value[0];
        if(!is_array($sub2)){
            $sub[$key] = $sub2;
            continue;
        }
        $final2 = array();
        foreach($sub2 as $key2 => $final)
            $final2[$key2] = $final[0];
        $sub[$key] = $final2;
    }
    $in = $sub;
}

var_dump($input);

您可以在此处进行测试:http://sandbox.onlinephpfunctions.com/code/a6770c7649d7d277aa1dc3544093cc87bed0951d

答案 1 :(得分:0)

这应该按预期工作:

function recursive_skip(array $ary) {
    foreach($ary as $k => &$v) {
        if (is_array($v)) {
            // Skip it
            $v = $v[0];
        }
        if (is_array($v)) {
            // If current array item is an array itself, recursively call the function on it
            $v = recursive_skip($v);
        }
    }

    // Return updated array to calling context
    return $ary;

}

$source = Array(
    'GetMLCBRes' => Array(Array(
        'Ord' => Array(Array(
                        'OrdId' => Array('DP Order ID')
        )),
        'ReqInf' => Array(Array(
                        'ReqDat' => Array('Date of Request')
        )),
        'Res' => Array('PDF Report')
    ))
);

$dest = recursive_skip($source);
var_dump($dest);

一些警告:该函数每次只跳过一个数组级别(但可以根据需要调整以处理更多),如果源数组很大,可能会带来很大的性能成本,因为它是递归的(O(n) ),它只是遍历整个数组树。