替换数组中的键,并保持顺序不变

时间:2020-03-28 16:56:24

标签: php

我想替换数组中的键,因为我会将它们移到两个索引上。 我面临的问题是,如果我想将它们包含相同的名称,那将是不可能的。

这是数组的样子。

@Qualifier
annotation class ApplicationContext 

);

这就是我希望通过在参数内部的Name0,Name1中更改键来实现输出的方式。

$list = array(
'ind' => array(
    'messagetype' => 'Alert',
    'visibility' => 'Public',
    'info' => array(
        0 => array(
            'urgency' => 'Urgent',
            'params' => array(
                0 => array(
                    'Name' => 'display',
                    'value' => '3; top',
                ),
                1 => array(
                    'Name' => 'level',
                    'value' => '1; blue',
                ),
            ),
            'area' => array(
                'ard' => 'Bob',
                'code' => array(
                    0 => array(
                        'Name' => 'Badge',
                        'value' => 'GSSD154',
                    ),
                ),
            ),
        ),
        1 => array(
            'messagetype' => 'Information',
            'visibility' => 'Private',
            'info' => array(
                0 => array(
                    'urgency' => 'Minor',
                    'params' => array(
                        0 => array(
                            'Name' => 'display',
                            'value' => '1; left',
                        ),
                        1 => array(
                            'Name' => 'level',
                            'value' => '1; red',
                        ),
                    ),
                    'area' => array(
                        'ard' => 'Bob',
                        'code' => array(
                            0 => array(
                                'Name' => 'Badge',
                                'value' => 'GBECS23',
                            ),
                        ),
                    ),
                ),
            ),
        ),
    ),
),

);

我在此网站上尝试了很多示例,但找不到一个示例可以实现。 我从中使用的代码 How to replace key in multidimensional array and maintain order

$list = array(
'ind' => array(
    'messagetype' => 'Alert',
    'visibility' => 'Public',
    'info' => array(
        0 => array(
            'urgency' => 'Urgent',
            'params' => array(
                0 => array(
                    'Name0' => 'display',
                    'value0' => '3; top',
                ),
                1 => array(
                    'Name1' => 'level',
                    'value1' => '1; blue',
                ),
            ),
            'area' => array(
                'ard' => 'Bob',
                'code' => array(
                    0 => array(
                        'Name' => 'Badge',
                        'value' => 'GSSD154',
                    ),
                ),
            ),
        ),
        1 => array(
            'messagetype' => 'Information',
            'visibility' => 'Private',
            'info' => array(
                0 => array(
                    'urgency' => 'Minor',
                    'params' => array(
                        0 => array(
                            'Name0' => 'display',
                            'value0' => '1; left',
                        ),
                        1 => array(
                            'Name1' => 'level',
                            'value1' => '1; red',
                        ),
                    ),
                    'area' => array(
                        'ard' => 'Bob',
                        'code' => array(
                            0 => array(
                                'Name' => 'Badge',
                                'value' => 'GBECS23',
                            ),
                        ),
                    ),
                ),
            ),
        ),
    ),
),

目前我得到以下输出:

       function replaceKey($subject, $newKey, $oldKey) {

    // if the value is not an array, then you have reached the deepest
    // point of the branch, so return the value
    if (!is_array($subject)) {
        return $subject;
    }

    $newArray = array(); // empty array to hold copy of subject
    foreach ($subject as $key => $value) {

        // replace the key with the new key only if it is the old key
        $key = ($key === $oldKey) ? $newKey : $key;

        // add the value with the recursive call
        $newArray[$key] = replaceKey($value, $newKey, $oldKey);
    }
    return $newArray;
}
$s = replaceKey($list, 'Name0', 'Name');

print "<PRE>";

print_r($s);
                                                [0] => Array
                                                    (
                                                        [Name0] => display
                                                        [value] => 1; left
                                                    )

任何帮助将不胜感激。问候

1 个答案:

答案 0 :(得分:1)

一个非常奇怪的问题,但为什么不呢?

以下函数不返回任何内容(过程),并使用引用更改数组 ,但可以将其重写为“ real” 函数(不带引用)并在某处带有return语句)。

该想法包括使用数字键和至少2个项目搜索数组,其中每个项目都具有 Name value 键。换句话说,这种方法并不关心目标应该位于的路径:

function replaceKeys(&$arr) {

    foreach ($arr as &$v) {
        if ( !is_array($v) )
            continue;

        $keys = array_keys($v);

        if ( count($keys) < 2 ||
             $keys !== array_flip($keys) ||
             array_keys(array_merge(...$v)) !== ['Name', 'value'] ) {
            replaceKeys($v);
            continue;
        }

        foreach ($v as $k => &$item) {
            $item = array_combine(["Name$k", "value$k"], $item);
        }
    }
}

replaceKeys($list);
print_r($list);

demo