什么';s将带括号的数组键转换为键的最简单方法->;php中的子键


What's the simplest way to convert array keys with parenthesis to key -> subkey in php?

我有这种类型的数组回来了:

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

我需要转换成这个:

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

请记住,可能还有其他键,所以简单地对计数运行for循环并输入每个值不是一种选择。

我想我会通过发布上面的简单例子来简化事情,但我想这还不够充分。

数据是从PayPal返回的字符串。PayPal有一个名为deformatNV()的函数,它完成了将其放入数组的初始工作,但它不是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;

有时有一些密钥是点状的,比如: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_之外的任何字符。