Изменение ключа массива без изменения порядка

Вы можете «изменить» ключ элемента массива, просто установив новый ключ и удалив старый:

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