我有一对由各自 ID 标识的密钥,如下所示:
array(
'key_a_0' => $a,
'key_a_1' => $a,
'key_b_0' => $b,
'key_b_1' => $b
)
我需要这个结构:
array(
'0' => array(
'key_a' => $a,
'key_b' => $b
),
'1' => array(
'key_a' => $a,
'key_b' => $b
)
)
实现这一目标的最佳方法是什么?
只要这就是所有数据的呈现方式和保持方式,那么就可以通过简单的
foreach
循环轻松修改为您需要的格式。
$new = array();
foreach($data as $key => $variable){
list($name,$var,$index) = explode("_", $key);
$new[$index][$name . '_' . $var] = $variable;
}
此返回;
Array
(
[0] => Array
(
[key_a] => 5
[key_b] => 10
)
[1] => Array
(
[key_a] => 5
[key_b] => 10
)
)
理想情况下 - 您希望在创建时设置数组结构,如 Dagon 所说。
以下内容应该可以完成这项工作。但是,这假设初始数组按特定顺序出现,并且该顺序是最终数组中每个嵌套数组中所期望的顺序,并且初始数组中的键始终采用该格式。
$a = 5;
$b = 10;
$aRawArray = array(
'key_a_0' => $a,
'key_a_1' => $a,
'key_b_0' => $b,
'key_b_1' => $b,
);
$aFormattedArray = array();
foreach ($aRawArray as $sKey => $mValue) {
$aKeyParts = explode('_', $sKey);
$sExtractedKey = $aKeyParts[2];
$sNewKey = $aKeyParts[0] . '_' . $aKeyParts[1];
if (!isset($aFormattedArray[$sExtractedKey])) {
$aFormattedArray[$sExtractedKey] = array();
}
$aFormattedArray[$sExtractedKey][$sNewKey] = $mValue;
}
var_dump($aFormattedArray);
您可以使用
preg_split()
仅在最后一个分隔符上拆分键,从而避免重新连接构成第二级键的部分。
代码:(演示)
$result = [];
foreach ($array as $k => $v) {
[$k2, $k1] = preg_split('/_(?=[^_]$)/', $k);
$result[$k1][$k2] = $v;
}
var_export($result);