PHP - изменить массив при сортировке

Мне нужно отсортировать массив строк в алфавитном порядке и установить каждый ключ таким же, как значение (потому что isset() намного быстрее, чем in_array()). Я могу легко сделать это, сделав два прохода по массиву, но мне было любопытно, можно ли сделать это только за один проход.

Я хотел бы превратить это:

array(
    0 => 'car',
    1 => 'apple',
    2 => 'dog',
    3 => 'box'
)

...в это:

array(
    'apple' => 'apple',
    'box' => 'box',
    'car' => 'car',
    'dog' => 'dog'
)

Я сделал несколько поисков, но ничего не могу найти по этому поводу (в основном я могу найти только информацию о сохранении отношения ключ-значение при сортировке).

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

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

В общем, попробуйте вставить строку. Если это не удается с ошибкой усечения, которая возникает при добавлении неопределенного значения перечисления, затем извлеките перечисления для столбца, проверьте, присутствует ли перечисление (это может быть другая проблема, вызывающая ошибку), если это не так, и значение не является NULL или пустой строкой, добавьте его.

Я хотел бы сохранить значения перечисления в алфавитном порядке для собственного здравомыслия, и я устанавливал ключи и значения одинаковыми, чтобы я мог сделать две вещи:

  1. Делайте isset($values($new_value)) вместо in_array($value,$values). Вот почему мне нужны значения в ключах.

  2. Используйте implode для создания инструкции ALTER: $query_text = "ALTER TABLE table CHANGE column column ENUM('".implode("','",$values)."')...;";

Я понимаю, что мог бы использовать implode("','",array_keys($values)) вместо этого в этой ситуации, но мне любопытно, как бы я сделал то, о чем изначально просил, потому что в будущем может наступить время, когда мне нужно будет сделать что-то более сложное для массива, одновременно сортируя его.

TL;DR: меня интересует не следует изменять этот массив при сортировке, а то, как я буду изменять массив при сортировке Это.


person JBHUTT09    schedule 12.07.2017    source источник
comment
Вы уверены, что никогда не получите 2 apple и, следовательно, не потеряете одно яблоко при тасовке?   -  person RiggsFolly    schedule 12.07.2017
comment
Поскольку массив передается в функцию сортировки по ссылке, вам необходимо сохранить его в переменной. Так что в одну строку не получится. Минимум с двумя.   -  person u_mulder    schedule 12.07.2017
comment
Какой смысл сопоставлять ключ с идентичным значением? Почему бы просто не array_flip массив?   -  person deceze♦    schedule 12.07.2017
comment
Почему вы хотите это сделать? Не имеет большого смысла с точки зрения массива. Может быть, вопрос должен быть, для чего это на самом деле используется?   -  person GrumpyCrouton    schedule 12.07.2017
comment
Я добавил некоторые уточнения. Не уверен, получают ли комментаторы уведомления об изменениях.   -  person JBHUTT09    schedule 13.07.2017


Ответы (2)


Вот что вам нужно:

<?php

$original = array(
    0 => 'car',
    1 => 'apple',
    2 => 'dog',
    3 => 'box'
);

$values = array_values($original);
sort($values);
$keys = array_combine($values, $values);

print_r($keys);
?>

и это распечатать

Array
(
    [apple] => apple
    [box] => box
    [car] => car
    [dog] => dog
)
person Marek Opatřil    schedule 12.07.2017

Если цель состоит в том, чтобы удалить дубликаты, отсортировать по алфавиту и насладиться производительностью isset(), то просто вызовите array_flip($array), а затем ksort($array).

В частности, array_flip() отсеет дубликаты и настроит isset().

В качестве альтернативы, если вы хотите создать идентичные пары ключ-значение:

Код: (Демо)

$array = ['car', 'apple', 'dog', 'box'];
sort($array);
var_export(array_combine($array, $array));  // no need to call array_values()

Выход:

array (
  'apple' => 'apple',
  'box' => 'box',
  'car' => 'car',
  'dog' => 'dog',
)

Я просто сделаю примечание для будущих исследователей... Хотя isset() быстрее, чем in_array(), выигрыш в производительности сводится на нет, если вы собираетесь переконфигурировать свой массив данных с большими трудностями.

person mickmackusa    schedule 16.05.2018