Вы можете «изменить» ключ элемента массива, просто установив новый ключ и удалив старый:
$array[$newKey] = $array[$oldKey]; unset($array[$oldKey]);
Но это переместит ключ в конец массива.
Есть ли элегантный способ изменить ключ, не меняя порядок?
(PS: Этот вопрос только из концептуального интереса, а не потому, что он мне нужен где угодно.)
Протестировано и работает 🙂
$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)) { throw new Exception(sprintf('Key "%s" does not exit', $old_key)); } $keys[$index] = $new_key; return array_combine($keys, array_values($array)); } $new_array = replace_key($array, "b", "e");
Нечто подобное может также работать:
$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));
ВЫВОД:
Array ( [en] => English [ZH] => Chinese [DA] => Danish [NL] => Dutch [FI] => Finnish [FR] => French [DE] => German )
Одним из способов было бы просто использовать 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; }
Другим способом было бы serialize
массив, str_replace
сериализованный ключ, а затем снова unserialize
обратно в массив. Это не особенно элегантная, хотя и вероятная склонность к ошибкам, особенно если у вас нет только скаляров или многомерных массивов.
Третий способ – мой любимый – вы будете писать array_key_rename
в C и предлагать его для ядра PHP;)
Мы используем эту функцию для изменения нескольких ключей массива в массиве, сохраняющих порядок:
function replace_keys($array, $keys_map) { $keys = array_keys($array); foreach($keys_map as $old_key=>$new_key){ if (false === $index = array_search($old_key, $keys)) { continue; } $keys[$index] = $new_key; } return array_combine($keys, array_values($array)); }
Вы можете передать массив как $ keys_map, например:
$keys_map=array("old_key_1"=>"new_key_1", "old_key_2"=>"new_key_2",...)
Это решение основано на Кристианском.
Сделайте двойной щелчок! По крайней мере, это все, о чем я могу думать:
$array=("foo"=>"bar","asdf"=>"fdsa"); $array=array_flip($array); $array["bar"]=>'newkey'; $array=array_flip($array);
Проточите$array=("foo"=>"bar","asdf"=>"fdsa"); $array=array_flip($array); $array["bar"]=>'newkey'; $array=array_flip($array);
Вы можете использовать array_combine . Он объединяет массив для ключей, а другой для значений …
Например:
$original_array =('foo'=>'bar','asdf'=>'fdsa'); $new_keys = array('abc', 'def'); $new_array = array_combine($new_keys, $original_array);