У меня есть ассоциативный массив в виде key => value
где ключ является числовым значением, однако это не последовательное числовое значение. Ключ на самом деле является идентификационным номером, а значение - счетчиком. Это нормально для большинства случаев, однако я хочу функцию, которая получает удобочитаемое имя массива и использует его для ключа без изменения значения.
Я не видел функцию, которая делает это, но я предполагаю, что мне нужно предоставить старый ключ и новый ключ (оба из которых у меня есть) и преобразовать массив. Есть ли эффективный способ сделать это?
php
arrays
associative-array
Томас Оуэнс
источник
источник
Ответы:
источник
Чтобы сделать это и сохранить порядок массива, нужно поместить ключи массива в отдельный массив, найти и заменить ключ в этом массиве, а затем объединить его обратно со значениями.
Вот функция, которая делает именно это:
источник
если ваш
array
построен из запроса к базе данных, вы можете изменить ключ непосредственно изmysql
оператора:вместо того
использовать что-то вроде:
источник
Ответ от KernelM хорош, но во избежание проблемы, поднятой Грегом в комментарии (конфликтующие ключи), было бы безопаснее использовать новый массив
источник
Вы можете использовать второй ассоциативный массив, который отображает понятные человеку имена на идентификаторы. Это также обеспечило бы отношение «многие к 1». Затем сделайте что-то вроде этого:
источник
Если вы также хотите, чтобы позиция нового ключа массива была такой же, как и у старого, вы можете сделать это:
источник
Если ваш массив рекурсивный, вы можете использовать эту функцию: протестируйте эти данные:
вот функция:
источник
источник
Мне нравится решение KernelM, но мне нужно что-то, что могло бы справиться с потенциальными конфликтами ключей (где новый ключ может соответствовать существующему ключу). Вот что я придумал:
Затем вы можете циклически перебирать массив следующим образом:
источник
Вот вспомогательная функция для достижения этой цели:
довольно основанный на ответе @KernelM .
Использование:
Он вернет true при успешном переименовании, иначе false .
источник
Легкие вещи:
эта функция будет принимать целевой $ hash, а $ replacements также является хешем, содержащим ассоциации newkey => oldkey .
Эта функция сохранит исходный порядок , но может быть проблематичной для очень больших (например, более 10 тыс. Записей) массивов, касающихся производительности и памяти .
эта альтернативная функция сделала бы то же самое, с гораздо лучшей производительностью и использованием памяти, за счет потери исходного порядка (что не должно быть проблемой, так как она хеш-таблица!)
источник
этот код поможет заменить старый ключ на новый
показывать как
источник
Простое сравнение производительности обоих решений.
Решение 1 Скопируйте и удалите (заказ потерян) https://stackoverflow.com/a/240676/1617857
Решение 2 Переименуйте ключ https://stackoverflow.com/a/21299719/1617857
Полученные результаты:
источник
Вы можете использовать эту функцию на основе array_walk:
Это дает:
источник
это работает для переименования первого ключа:
затем print_r ($ a) отображает восстановленный массив в порядке:
это работает для переименования произвольного ключа:
print_r ($ а)
обобщенная функция:
источник
Если вы хотите заменить несколько ключей одновременно (сохраняя порядок):
Использование:
источник
Существует альтернативный способ изменить ключ элемента массива при работе с полным массивом - без изменения порядка массива. Это просто скопировать массив в новый массив.
Например, я работал со смешанным многомерным массивом, который содержал индексированные и ассоциативные ключи - и я хотел заменить целочисленные ключи их значениями, не нарушая порядок.
Я сделал это, переключив ключ / значение для всех записей числового массива - здесь: ['0' => 'foo']. Обратите внимание, что заказ не поврежден.
Вывод:
источник
лучший способ - использовать ссылку, а не использовать unset (что делает еще один шаг для очистки памяти)
решение:
у вас есть один оригинал и одна ссылка с новым именем.
или, если вы не хотите иметь два имени в одном значении, хорошо сделать другую вкладку и foreach по ссылке
Итерация лучше для ключей, чем клонирование всего массива, и очистка старого массива, если у вас длинные данные, такие как 100 строк +++ и т. Д.
источник
Хм, я не тестировал раньше, но я думаю, что этот код работает
источник
Тот, который сохраняет порядок, который прост для понимания:
источник
Вы можете написать простую функцию, которая применяет обратный вызов к ключам данного массива. Похож на массив
Вот суть https://gist.github.com/vardius/650367e15abfb58bcd72ca47eff096ca#file-array_map_keys-php .
источник
Эта функция переименует ключ массива, сохраняя его позицию, в сочетании с поиском по индексу.
Использование:
источник
Эта базовая функция обрабатывает замену ключей массива и поддерживает массив в исходном порядке ...
Затем вы можете перебрать и поменять местами все клавиши «а» с «z», например ...
источник