在PHP中简化多维数组

3

我收到了一个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个回答

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


你的函数在这个样本数组上运行得很好。但是它在更深层次的维度上无法正常工作。你能帮忙修改脚本以递归运行吗?谢谢。 - user915218

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)),它只是遍历整个数组树。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接