PHP数组重命名动态数组键

时间:2012-11-15 14:26:54

标签: php arrays

我需要重命名动态数组键,并创建一个新数组。 这是给定的数组:

array(21)
{
    ["0161"] =>
    array(5)
    {
        ["L_NAME0161"] =>
        string(13) "john%20Hewett"
        ["L_TRANSACTIONID0161"] =>
        string(17) "50350073XN1446019"
        ["L_AMT0161"] =>
        string(6) "8%2e50"
        ["L_FEEAMT0161"] =>
        string(9) "%2d0%2e55"
        ["L_NETAMT0161"] =>
        string(6) "7%2e95"
    }
    ["08591"] =>
    array(5)
    {
        ["L_NAME08591"] =>
        string(18) "Norbert%20Bendixen"
        ["L_TRANSACTIONID08591"] =>
        string(17) "1WN98871MS4263823"
        ["L_AMT08591"] =>
        string(6) "8%2e50"
        ["L_FEEAMT08591"] =>
        string(9) "%2d0%2e55"
        ["L_NETAMT08591"] =>
        string(6) "7%2e95"
    }
}

以下是我使用的代码对我不起作用:

foreach ($reb AS $newrebarray)
{
    foreach ($newrebarray as $ke => $val)
    {

        if (preg_match("/L_NETAMT/i", $ke))
        {
            $newarrayreb1 = array('Net' => $val);
        }
        if (preg_match("/L_TRANSACTIONID/i", $ke))
        {
            $newarrayreb1 = array('TransactID' => $val);
        }
        if (preg_match("/L_NAME/i", $ke))
        {
            $newarrayreb1 = array('Name' => $val);
        }
    }
}

注意数组键是动态的,我想创建一个带有静态键的新数组,以及相关的值。当我运行代码时,我得到五个不同的数组。

2 个答案:

答案 0 :(得分:1)

未经测试,尚未完全唤醒,所以这可能会踢你的狗并删除你所有的存档游戏:

$translations = array(
    'L_TRANSACTIONID' => 'Translation',
    'L_NAME' => 'Name',
    'L_NETAMT' => 'Net'
);

foreach($array as $parentkey => $subarray) {
    foreach($subarray as $subkey => $val) {
       if (preg_match('/^(L_.*?)\d*$/', $matches)) {
           $newKey = $translations[$matches[1]];
           $array[$parentkey][$newkey] = $val;
           unset($array[$parentkey][$subkey]);
       }
    }
}

答案 1 :(得分:1)

首先,我将根据正则表达式的捕获内存段定义一个替换函数:

function do_translate($match)
{
    switch ($match[1]) {
        case 'L_NAME':
            return 'Name';

        case 'L_NETAMT':
            return 'Net';

        case 'L_TRANSACTIONID':
            return 'TransactID';
    }
    // in all other cases, return the full match
    return $match[0];
}

然后迭代块,通过转换传递发送数组键,然后将新键与现有值重新组合:

foreach ($reb as $id => $data) {
        $new_keys = preg_replace_callback('/^(L_[A-Z]+)' . preg_quote($id) . '$/i', 'do_translate', array_keys($data));
        // create the new array with translated keys
        $reb[$id] = array_combine($new_keys, $data);
}

我注意到数组键是字段和产品ID的组合(我猜),所以我用这些知识来强化正则表达式