我有这种类型的阵列回来了:
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;
答案 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;
}
}
请记住,它只是将字符串拆分为非单词字符(\W
)。 \W
匹配a-z
,A-Z
,0-9
和_
以外的任何字符。