Переключите два объекта в ассоциативный массив

Пример:

$arr = array(
  'apple'      => 'sweet',
  'grapefruit' => 'bitter',
  'pear'       => 'tasty',
  'banana'     => 'yellow'
);

Я хочу переключить положения грейпфрута и груши, таким образом, массив станет

$arr = array(
  'apple'      => 'sweet',
  'pear'       => 'tasty',
  'grapefruit' => 'bitter',
  'banana'     => 'yellow'
)

Я знаю ключи и значения элементов, которые я хочу переключить, там простой способ сделать это? Или это потребует цикла + создание нового массива?

Спасибо

15
задан leon.nk 15 January 2012 в 15:30
поделиться

7 ответов

Нет простого способа, просто цикл или новое определение массива.

0
ответ дан 1 December 2019 в 03:14
поделиться

если массив поступает из базы данных, добавьте поле sort_order, чтобы вы всегда могли быть уверены, в каком порядке элементы в массиве.

2
ответ дан 1 December 2019 в 03:14
поделиться

Это может быть или не быть вариантом в зависимости от вашего конкретного случая использования, но если вы инициализируете свой массив нулевыми значениями с соответствующими ключами перед заполнением его данными, вы можете установить значения в любом порядке и исходный ключ -заказ будет сохранен. Таким образом, вместо того, чтобы менять местами элементы, вы можете избавиться от необходимости менять их полностью:

$arr = array('apple' => null,
             'pear' => null,
             'grapefruit' => null,
             'banana' => null);

...

$arr['apple'] = 'sweet';
$arr['grapefruit'] = 'bitter'; // set grapefruit before setting pear
$arr['pear'] = 'tasty';
$arr['banana'] = 'yellow';
print_r($arr);

>>> Array
(
    [apple] => sweet
    [pear] => tasty
    [grapefruit] => bitter
    [banana] => yellow
)
1
ответ дан 1 December 2019 в 03:14
поделиться

Массивы в php - это упорядоченные карты.

$arr = array('apple'=>'sweet','grapefruit'=>'bitter','
pear'=>'tasty','banana'=>'yellow');

не означает, что первым элементом является «яблоко» => «сладкий», а последним - «банан» => «желтый» только потому, что вы поставили «яблоко» первым, а «банан» - последним. Фактически, 'apple' => 'sweet' будет первым, а 'banana' => 'yellow' будет вторым из-за алфавитного порядка сортировки по возрастанию.

-2
ответ дан 1 December 2019 в 03:14
поделиться

да, я согласен с Лексом, если вы используете ассоциативный массив для хранения данных, почему бы вам не использовать свою логику для обработки доступа к ним, а не зависеть от того, как они расположены в массиве.

Если вы действительно хотите убедиться, что они расположены в правильном порядке, попробуйте создать объекты фруктов, а затем поместить их в обычный массив.

0
ответ дан 1 December 2019 в 03:14
поделиться

Нет простого способа сделать это. Это звучит как небольшая ошибка логики дизайна с вашей стороны, которая побудила вас попытаться сделать это, когда есть лучший способ сделать то, что вы хотите сделать. Можете ли вы сказать нам, почему вы хотите это сделать?

Вы говорите, что я знаю ключи и значения элементов, которые я хочу переключить , что заставляет меня думать, что вам действительно нужна функция сортировки, поскольку вы можете легко получить доступ к нужным элементам в любое время, как они есть.

$value = $array[$key];

Если это так, я бы использовал sort () , ksort () или одну из многих других функций сортировки, чтобы получить нужный массив. Вы даже можете использовать usort () от до Сортировать массив по значениям, используя определяемую пользователем функцию сравнения .

Кроме этого, вы можете использовать array_replace () , если вам когда-нибудь понадобится поменять местами значения или ключи.

0
ответ дан 1 December 2019 в 03:14
поделиться

Классический ассоциативный массив никоим образом не определяет и не гарантирует последовательность элементов. Для этого есть простой массив / вектор. Если вы используете ассоциативный массив, предполагается, что вам нужен произвольный, но не последовательный доступ. Для меня вы используете массив ассоциаций для задачи, для которой он не предназначен.

0
ответ дан 1 December 2019 в 03:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: