PHP на месте меняет один ключ в ассоциативном массиве?

Предположим, у меня есть этот ассоциативный массив:

$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) подход к этому, чтобы сделать это на месте?


person RocketNuts    schedule 27.04.2016    source источник
comment
На самом деле то, что у вас есть, является правильным. Здесь нет порядка. Это не имеет никакого значения. Зачем нужен конкретный заказ? Тогда вы можете использовать числовые индексы, верно?   -  person Praveen Kumar Purushothaman    schedule 27.04.2016
comment
Сначала вы должны понять, как работают массивы в php....php.net/manual /en/language.types.array.php   -  person George Pant    schedule 28.04.2016
comment
@PraveenKumar Если я не ошибаюсь, массивы PHP упорядочены? (также по ссылке @GeorgePant?), если я делаю implode(' ',$fruits), я всегда получаю один и тот же результат, то есть "strawberry banana apple" в таком порядке.   -  person RocketNuts    schedule 28.04.2016
comment
@RocketNuts, вы должны понимать, как работают массивы php, прежде чем отклонять правильные ответы из-за того, что они не умны/эффективны. Если вы понимаете, что в php порядок ассоциативных массивов — это просто порядок, в котором элементы вставляются в массив, тогда вы поймете, что наиболее эффективный и разумный способ сделать это — перестроить массив.   -  person George Pant    schedule 28.04.2016
comment
@GeorgePant Эм, я еще не отклонил ни одного ответа? Я только прокомментировал ответ cpugourou, спросив, что предлагает его ответ по сравнению с тем, что я уже предложил в своем OP. Кроме того, я уже упоминал, что, конечно, могу перестроить массив вручную, мне просто было интересно, есть ли какая-то встроенная функция или оператор, встроенный в PHP, который мог бы делать то же самое. Очевидно, что вы можете изменять значения в массивах на месте, и мой вопрос был просто в том, возможно ли это также для ключей.   -  person RocketNuts    schedule 28.04.2016


Ответы (3)


Следующий пример в основном взят из array_splice() для ассоциативных массивов.

$newArray = array_slice($fruits, 0, $offset, true) +
            array('yellow' => 'banana') +
            array_slice($fruits, $offset, NULL, true);

                        print_r($newArray);

Если мы знаем смещение того места, где находится ключ «синий», мы можем добавить на его место новый ключ желтого цвета.

Итак, в вашем случае смещение равно 1, потому что синий является вторым ключом в массиве.

person rharvey    schedule 27.04.2016
comment
Это не отвечает на этот вопрос. Расскажите в своем ответе, как это относится к этому вопросу? - person Praveen Kumar Purushothaman; 27.04.2016

Самый быстрый способ:

foreach($fruits as $key=>$value){ 
     If ($key==="blue"){
         $fruits["yellow"]= $value;
         unset($fruits[$key]);
     }
 }
person cpugourou    schedule 27.04.2016
comment
Как это быстрее, чем (или даже так же быстро), как я написал в своем вопросе? (я имею в виду $fruits['yellow'] = $fruits['blue']; unset($fruits['blue']);) - person RocketNuts; 28.04.2016

Одним из решений было бы получить ключи с помощью 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;
person George Pant    schedule 27.04.2016