将带括号的数组键转换为键的最简单方法是什么?> php中的子键?

时间:2012-02-28 18:55:25

标签: php multidimensional-array

我有这种类型的阵列回来了:

Array
(
    [data(0)] => somevalue
    [data(1)] => somevalue
    [data(2)] => somevalue
)

我需要转换成这个:

Array (
    [data] => Array (somevalue
        [0] => somevalue
        [1] => somevalue
        [2] => somevalue
    )
)

请记住,可以有其他键,因此只需在计数上运行for循环并输入每个值都不是一个选项。

我认为我会通过发布上面的简单示例来简化事情,但我想这并没有说明这个故事。

数据是来自PayPal的字符串。 PayPal有一个名为deformatNVP()的函数,它完成了将它放入数组的初始工作,但它不是PHP可以处理的数组。它看起来像这样:

Array(
    [responseEnvelope.ack] => somevalue
    [responseEnvelope.timestamp] => somevalue
    [responseEnvelope.build] => somevalue
    [responseEnvelope.correlationId] => somevalue
)

它也可能有:

Array(
    [personalData(0)] => somevalue
    [personalData(1)] => somevalue
    [personalData(2)] => somevalue
)

这完全是丑陋的,所以下面的第一步修复了虚线数组,但我留下了这些带括号的键来处理。

$data = array();
foreach ($array as $key => $value) {

    $subkey = "";
    $_keys = explode('.', $key);

    if(count($_keys) > 1){
        $key = $_keys[0];
        $subkey = $_keys[1];
    }

    if(preg_match("/([0-9]+)/", $key, $matches)){
        $key = preg_replace("/\([0-9]+\)/", "", $key);
        $data[$key][$matches[0]][$subkey] = $value;
    }
    elseif($subkey)
        $data[$key][$subkey] = $value;
    else
        $data[$key] = $value;

}
return $data;

1 个答案:

答案 0 :(得分:2)

  

有时会出现点缀的键:key.subkey

如果出现.的内容,有时候其他内容也会出现。在开发任何解析它的算法之前,该规范应该足够清楚。

到目前为止,可以通过循环遍历每个元素并使用preg_split函数分割信息来完成。下面的代码将结果数组放在$result变量中。

$result = array();
foreach ($array as $key => $value) {
    list($text, $subkey) = preg_split('/\W+/', "$key:END", 3, PREG_SPLIT_NO_EMPTY);
    if($subkey=='END'){
    $result[$text] = $value; continue;
    }else{
    $result[$text][$subkey] = $value;
    }
}

请参阅http://ideone.com/CJHHZ

请记住,它只是将字符串拆分为非单词字符(\W)。 \W匹配a-zA-Z0-9_以外的任何字符。