更改数组键而不更改顺序

Nik*_*kiC 21 php arrays

您只需设置新密钥并删除旧密钥即可"更改"数组元素的键:

$array[$newKey] = $array[$oldKey];
unset($array[$oldKey]);
Run Code Online (Sandbox Code Playgroud)

但是这会将键移动到数组的末尾.

是否有一些优雅的方式来改变密钥而不改变顺序?

(PS:这个问题仅仅是出于概念上的兴趣,而不是因为我在任何地方都需要它.)

Kri*_*ian 27

经过测试和工作:)

$array = array( "a" => "1", "b" => "2", "c" => "3" );

function replace_key($array, $old_key, $new_key) {
    $keys = array_keys($array);
    if (false === $index = array_search($old_key, $keys, true)) {
        throw new Exception(sprintf('Key "%s" does not exist', $old_key));
    }
    $keys[$index] = $new_key;
    return array_combine($keys, array_values($array));
}

$new_array = replace_key($array, "b", "e");
Run Code Online (Sandbox Code Playgroud)

  • 返回未更改的数组而不是抛出异常不是更好吗? (2认同)

anu*_*ava 10

这样的事情也可能有效:

$langs = array("EN" => "English", 
        "ZH" => "Chinese", 
        "DA" => "Danish",
        "NL" => "Dutch", 
        "FI" => "Finnish", 
        "FR" => "French",
        "DE" => "German");
$json = str_replace('"EN":', '"en":', json_encode($langs));
print_r(json_decode($json, true));
Run Code Online (Sandbox Code Playgroud)

OUTPUT:

Array
(
    [en] => English
    [ZH] => Chinese
    [DA] => Danish
    [NL] => Dutch
    [FI] => Finnish
    [FR] => French
    [DE] => German
)
Run Code Online (Sandbox Code Playgroud)

  • 我个人觉得这个解决方案很优雅!+1 (7认同)
  • 我发现这不优雅.非常危险. (4认同)
  • 我也是.当使用Zend_Config_XML :: toArray()时,这对于从XML标记名称中删除破折号/下划线非常有用.就我而言,数据是选择元素w/optgroups的选项.我的optgroup名称是XML标签,标题有破折号.这对此很有用. (3认同)

Gor*_*don 6

一种方法是简单地使用foreach迭代数组并将其复制到新数组,在迭代时有条件地更改键,例如,如果$ key ==='foo'则不使用foo但是bar:

function array_key_rename($array, $oldKey, $newKey) 
{
    $newArray = [];
    foreach ($array as $key => $value) {
        $newArray[$key === $oldKey ? $newKey : $key] = $value;
    }
    return $newArray;
}
Run Code Online (Sandbox Code Playgroud)

另一种方法是serialize数组,str_replace序列化密钥,然后unserialize再次返回一个数组.虽然这并不是特别优雅且容易出错,特别是当你不只有标量或多维数组时.

第三种方式 - 我最喜欢的 - 就是你array_key_rename用C语言编写并为PHP核心提出它;)