通过最后一个分隔符分割平面关联数组的键,然后使用键部分构建二维关联数组

问题描述 投票:0回答:3

我有一对由各自 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
    )
)

实现这一目标的最佳方法是什么?

php arrays multidimensional-array grouping
3个回答
2
投票

只要这就是所有数据的呈现方式和保持方式,那么就可以通过简单的

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 所说


0
投票

以下内容应该可以完成这项工作。但是,这假设初始数组按特定顺序出现,并且该顺序是最终数组中每个嵌套数组中所期望的顺序,并且初始数组中的键始终采用该格式。

$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);

0
投票

您可以使用

preg_split()
仅在最后一个分隔符上拆分键,从而避免重新连接构成第二级键的部分。

代码:(演示

$result = [];
foreach ($array as $k => $v) {
    [$k2, $k1] = preg_split('/_(?=[^_]$)/', $k);
    $result[$k1][$k2] = $v;
}
var_export($result);
© www.soinside.com 2019 - 2024. All rights reserved.