Возможно ли в PHP сделать что-то подобное? Как бы вы пошли о написании функции? Вот пример. Порядок это самая важная вещь.
$customer['address'] = '123 fake st';
$customer['name'] = 'Tim';
$customer['dob'] = '12/08/1986';
$customer['dontSortMe'] = 'this value doesnt need to be sorted';
И я хотел бы сделать что-то вроде
$properOrderedArray = sortArrayByArray($customer, array('name', 'dob', 'address'));
Потому что в конце я использую foreach (), и они не в правильном порядке (потому что я добавляю значения в строку, которая должна быть в правильном порядке, и я не знаю заранее все ключи массива / ценности).
Я просмотрел внутренние функции массива PHP, но кажется, что вы можете сортировать только по алфавиту или по номерам.
Там вы идете:
источник
array_merge()
!usort()
илиuasort()
?break
заявление, как только значение будет найдено.array_merge()
на+
оператор массива . Он объединяется по ключу (также для цифровых клавиш) и слева направо , аarray_merge
объединяется справа налево и никогда не перезаписывает числовые клавиши. Например,[0,1,2]+[0,5,6,7] = [0,1,2,7]
покаarray_merge([0,1,2],[0,5,6,7]) = [0,1,2,0,5,6,7]
и['a' => 5] + ['a' => 7] = ['a' => 5]
ноarray_merge(['a' => 5], ['a' => 7]) = ['a' => 7]
.+
знак?Как насчет этого решения
источник
O(n * log n)
, то этот алгоритм работаетO(n^2 * log(n))
.Другой способ для PHP> = 5.3.0:
Результат:
Прекрасно работает со строковыми и числовыми клавишами.
источник
array_replace()
что намерение передавать лучше, чемarray_merge()
.array_replace
также оставляет тип переменной нетронутым. Если бы одно из значений в вашем массиве было бы,(string) '1'
и вы бы использовали+
оператор, значение было бы преобразовано в(int) 1
array_merge()
просто добавит их?). Логика очень хорошо объяснена здесь . Во- первых ,array_flip()
изменения значения в $ Заказ массива до ключей. Во-вторых ,array_replace()
заменяет значения первого массива значениями, имеющими те же ключи во втором массиве. Если вам нужно отсортировать массив по ключам от другого, вам даже не нужно его использоватьarray_flip
.источник
Возьмите один массив в качестве вашего заказа:
Вы можете отсортировать другой массив на основе значений, используя
array_intersect
Docs :Или, в вашем случае, для сортировки по ключам используйте
array_intersect_key
Docs :Обе функции сохранят порядок первого параметра и будут возвращать только значения (или ключи) из второго массива.
Таким образом, для этих двух стандартных случаев вам не нужно самостоятельно писать функцию для выполнения сортировки / реорганизации.
источник
Я использовал решение Darkwaltz4, но использовал
array_fill_keys
вместоarray_flip
, чтобы заполнить,NULL
если ключ не установлен$array
.источник
Без магии ...
источник
$dataset
чтобы соответствовать имени параметраЕсли у вас есть массив в вашем массиве, вам придется немного адаптировать функцию Эрана ...
источник
Эта функция возвращает подчиненный и отсортированный массив на основе второго параметра $ keys
Пример:
источник
PHP имеет функции, которые помогут вам в этом:
Usort делает всю работу за вас, а array_search предоставляет ключи. array_search () возвращает false, когда не может найти соответствие, поэтому элементы, которых нет в массиве sort, естественным образом перемещаются в конец массива.
Примечание: uasort () упорядочит массив, не затрагивая отношения ключ => значение.
источник
Код:
источник
Первое предложение
Второе предложение
Я хотел бы отметить, что оба эти предложения являются удивительными. Однако это яблоки и апельсины. Различия? Один не ассоциативный, а другой дружественный. Если вы используете 2 полностью ассоциативных массива, тогда массив merge / flip фактически объединит и перезапишет другой ассоциативный массив. В моем случае это не тот результат, который я искал. Я использовал файл settings.ini для создания массива порядка сортировки. Массив данных, который я сортировал, не должен был перезаписываться моим коллегой по сортировке. Таким образом, слияние массива уничтожит мой массив данных. Оба являются отличными методами, оба должны быть заархивированы в любом наборе инструментов для разработчиков. Исходя из ваших потребностей, вы можете обнаружить, что вам действительно нужны обе концепции в ваших архивах.
источник
Я взял ответ от @ Darkwaltz4 для его краткости и хотел бы поделиться тем, как я адаптировал решение к ситуациям, когда массив может содержать разные ключи для каждой итерации, например:
и поддерживал «главный ключ» примерно так:
array_merge выполнил бы слияние в итерации Array [1] на основе $ master_key и произвело бы ['some_key'] = '', пустое значение, для этой итерации. Следовательно, array_intersect_key использовался для изменения $ master_key в каждой итерации следующим образом:
источник
Немного поздно, но я не смог найти способ, которым я это реализовал, эта версия требует закрытия, php> = 5.3, но может быть изменена не так:
Конечно, 'dontSortMe' нужно отсортировать, и он может появиться первым в примере
источник