Предположим, у меня есть этот ассоциативный массив:
$fruits = array(
'red' => 'strawberry',
'blue' => 'banana',
'green' => 'apple',
);
Я хочу поменять ключ blue
в yellow
, Обратите внимание, что я хочу изменить ключ, не ценность. Я мог бы сделать это:
$fruits['yellow'] = $fruits['blue'];
unset($fruits['blue']);
Но это приводит к 'yellow' => 'banana'
быть в конец массива. Если бы мне нужно было поддерживать порядок массива, так 'yellow' => 'banana'
находится в том же положении, что и 'blue' => 'banana'
был раньше, как мне это сделать?
Конечно, я могу восстановить весь массив, добавив все пары ключ / значение и просто вставив yellow
вместо blue
ключ, но это кажется довольно вялым способом сделать это.
Есть ли более разумный / более эффективный (предпочтительно PHP-нативный) подход к этому, чтобы сделать это на месте?
Следующий пример в основном взят из array_splice () для ассоциативных массивов
$newArray = array_slice($fruits, 0, $offset, true) +
array('yellow' => 'banana') +
array_slice($fruits, $offset, NULL, true);
print_r($newArray);
Если мы знаем смещение, где находится клавиша «синий», мы можем добавить новый ключ желтого цвета на его место.
Так что в вашем случае смещение равно 1, потому что синий является вторым ключом в массиве.
Самый быстрый способ:
foreach($fruits as $key=>$value){
If ($key==="blue"){
$fruits["yellow"]= $value;
unset($fruits[$key]);
}
}
Одним из решений было бы получить ключи с помощью array_keys, применить функцию, чтобы изменить их, как вы хотите, а затем объединить новые ключи со значениями, используя array_combine
$array = array_combine(array_map('replace_key', array_keys($fruits)), $fruits);
function replace_key($key){
if($key=="blue") return "yellow";
return $key;
}
Другое решение было бы использовать array_walk
$result = array();
array_walk($fruits, function (&$value,$key) use (&$result) {
if($key=="blue") $key="yellow";
$result[ $key ] = $value;
});
print_r($result);
Другой способ сделать это (и, вероятно, быстрее), используя foreach
Зациклите и перестройте массив. И если вы хотите универсальное решение, просто напишите простую функцию на основе этого кода:
$temp_array=array();
foreach($fruits as $key=>$value){
if($key=="blue") $key="yellow";
$temp_array[$key]=$value;
}
$fruits=$temp_array;