Любые способы уменьшить повторяющиеся шаблоны кода в php

#php

#php

Вопрос:

У меня есть несколько кодов здесь

 if ($brand == "Kumiai Dairies" || $brand == "Anlene" || $brand == "Yoplait" || $brand == "Hokkaido Hidaka" 
|| $brand == "Jacob's" || $brand == "V8" || $brand == "Cow amp; Gate"){
do something here;
}
  

Есть ли какой-либо способ предотвратить повторение $brand == «xxx»??

Ответ №1:

Да, вы можете использовать in_array :

 in_array($brand, array('Kumiai bla', 'Analblah', 'Whatever', ...))
  

Комментарии:

1. В этой ситуации это несущественно, но, возможно, стоит упомянуть OP, что in_array — это линейный поиск, а array_key_exist (или isset для ключа) — постоянное время. Иногда я использую подход Феликса, если это большой массив, в котором часто выполняется поиск.

2. @red23jordan: линейный поиск требует O(n) времени, чтобы найти элемент. Если у вас есть массив с 1000 элементами, вам нужно сделать 1000 сравнений (в худшем случае). Поиск элемента в хэш-таблице, подобной структуре данных, требует O(1) , поэтому он не зависит от размера вашего набора. Для небольших наборов, таких как ваш, разница незначительна.

3. Ассоциативный массив в PHP — это, по сути, хэш-таблица. Поиск значения в хеш-таблице — это операция с постоянным временем (или … постоянная). Хэш-таблицы отображают ключ в слот. однако in_array должен выполнять линейный поиск по всем значениям, потому что нет быстрого способа найти значение на основе чего-то другого. (Если массив был отсортирован или что-то в этом роде, можно было бы выполнить двоичный поиск или что-то лучше, чем линейный поиск, но хэш-таблица все равно всегда выигрывает.) Редактировать: Феликс опередил меня :). Собираюсь оставить это, потому что это сформулировано немного по-другому.

Ответ №2:

Вы можете создать ассоциативный массив:

 $brands = array(
    "Kumiai Dairies" => true,
    "Anlene" => true,
    ...
);
  

а затем проверьте это с помощью

 if(isset($brands[$brand])) {

}
  

Смотрите комментарий @Corbin в ответе @ThiefMaster для объяснения различий этих двух подходов.

Комментарии:

1. Вероятно, вы могли бы сделать определение массива намного лучше, используя обычный массив, а затем array_flip() его.

2. однако array_flipping будет выполняться за линейное время, поэтому переключение будет полезно только в том случае, если поиск будет выполняться несколько раз при одном запуске скрипта.

Ответ №3:

Вы можете использовать switch, 1. он быстрый, поиск выполняется постоянно 2. не нужно каждый раз создавать массив и искать в нем.

 switch($brand){
case "Kumiai Dairies":
case "Anlene":
....
....
//do something
break;
}