Есть один супер декоратор у меня PHP: public function getDefense($country_code) { // Германия - бонус наземной техники if ($country_code == 'de' and $this->type == 'ground') { $this->defense *= 1.2; } // Россия - бонус морской техники if ($country_code == 'ru' and $this->type == 'marine') { $this->defense *= 1.2; } // США - бонус воздушной техники if ($country_code == 'us' and $this->type == 'air') { $this->defense *= 1.2; } // Если нет изменений, то Китай, Казахстан, Украина, Беларусь: значение по дефолту return $this->defense; } Что не нравится: мозолят глаза однотипные вроде как условия с одинаковым действием. Есть идея в скобках через OR их все запилить в одно условие, но может у кого-то опыта побольше и есть какие-нибудь покруче наработки, поделитесь.
Проверка существования ключей в многомерном массивe. PHP: if(isset($array[$country_code][$this->type])) $this->defense *= $array[$country_code][$this->type];
@Drunkenmunky только теперь в массиве повторы - 1.2 PHP: public function getDefense($country_code) { $array = ['de' => ['ground' => 1.2], 'ru' => ['marine' => 1.2], 'us' => ['air' => 1.2]]; if (isset($array[$country_code][$this->type])) { $this->defense *= $array[$country_code][$this->type]; } return $this->defense; } хотя нормально вроде, вдруг там бонус меняться будет или разный для каждой страны, оставлю пожалуй так
это где так у меня? у меня 7 стран и три типа техники, 20% бонус только трём странам на определённую техну, если условие(я): {страна-техника} не совпали, то дефолт вернёт без бонуса ЖЕ я УЖЕ подумал что на случай изменения размера(ов) бонуса то подойдёт и с таким массивом
ты обрезал код там в конце метода PHP: // Если нет изменений, то Китай, Казахстан, Украина, Беларусь: значение по дефолту return $this->defense; --- Добавлено --- @Drunkenmunky понял? дефолт 100 если например Россия, то 120, если Беларусь, то 100 так и вернётся условие изменяет возвращаемое значение свойства при совпадении
Тогда еще проще. Два массива - со страной и техникой, если оба параметра присутствуют и там и там, то бонус. in_array() в помощь.
ага, мне эта мысль как раз тоже мелькнула, когда я массив под твой пример рисовал, тоже надо попробовать, спс... --- Добавлено --- @Drunkenmunky твой пример хорош тем, что можно отдельно под каждую страну бонус назначить
а я наоборот глухо забил по 1.2, а теперь думаю ё-маё, так можно же будет менять чёт тупанул, ок, вроде порешали
PHP: public function getDefense( string $country_code )/* : int | float */ { $a = array_fill_keys ( [ 'de#ground', 'ru#marine', 'us#air' ], 1.2 ); if ( isset ( $a[$country_code . '#' . $this -> type] ) ) { $this->defense *= $a[$country_code . '#' . $this -> type]; } return $this -> defense; } public function getDefense( string $country_code )/* : int | float */ { if ( in_array ( $country_code . '#' . $this -> type, [ 'de#ground', 'ru#marine', 'us#air' ], true ) ) { $this -> defense *= 1.2; } return $this -> defense; }
PHP 8 PHP: public function getDefense( string $country_code ): int | float { return match ( $country_code . '#' . $this -> type ) { 'de#ground', 'ru#marine', 'us#air' => $this -> defense *= 1.2, 'kr#power' => $this -> defense *= 100500, default => $this -> defense, }; }
@MouseZver благодарю, буду пробовать подтолкнули в этой теме меня смотреть в сторону массивов, нашёл я такую вот функцию: возыращает ключ совпадающего значения, я не фанат работы с массивами, правильно ли я применил функцию? PHP: public function getDefense($country_code) { if ($country_code == array_search($this->type, ['de' => 'ground', 'ru' => 'marine', 'us' => 'air'])) { $this->defense *= 1.2; } return $this->defense; } --- Добавлено --- @MouseZver мне варик с in_array приколол больше всего, я таких фокусов ещё не видел
array_search - медленный in_array - менее медленный isset - fast match - неизвестно. При тесте нужно учитывать громоздкость кода, быстродействие, меньше php действий = лучше, удобность кодинга --- Добавлено --- Для примера: PHP: if ( $array != [] ) {} if ( empty ( $array ) ) {} // на 40% быстрее работает
@MouseZver я на 7.4 сижу, забрал варик с in_array, всё гениальное - просто, блин это же надо: тупо конкатенировать и сравнить, я чёт не допёр, нормально так