Как лучше всего в PHP назначить переменную в зависимости от двух независимых условий (-> четыре возможных значения)?

У меня есть переменная, которой нужно присвоить одно из четырех возможных значений в зависимости от двух условий.

В настоящее время я делаю это:

if (conditionsOne) {
  $foo = (conditionTwo) ? 'one' : 'two';
} else {
  $foo = (conditionTwo) ? 'three' : 'four';
}

Но это, ИМХО, немного задевает "золотое правило" программирования, которое гласит: "никогда не пишите один и тот же код дважды" (если кто-то меняет conditionTwo и забывает изменить другой conditionTwo, у нас ошибка).

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

Есть ли способ в PHP сделать такое назначение без дублирования кода (чтобы не проверять дважды одно и то же условие) и без ущерба для читабельности?


person Foo Bar    schedule 15.12.2014    source источник


Ответы (3)


Сохраните результат и используйте switch:

$s = 0;

if (conditionOne) {
  $s += 1;
}
if ($conditionTwo) {
  $s += 10;
}

switch ($s) {
   case 0: $foo = 'four'; break;
   case 1: $foo = 'two'; break;
   case 10: $foo = 'three'; break;
   case 11: $foo = 'one'; break;
}
person Bart Friederichs    schedule 15.12.2014
comment
Интересный способ! Я так не думал. - person Rizier123; 15.12.2014

это должно работать...

$values=array(array(“four”,”three”),array(“two”,”one”));
$foo=$values[$conditionsOne][$conditionsTwo];  
person Luca Rocchi    schedule 15.12.2014
comment
Я сомневаюсь, что вы можете (должны ли?) индексировать массив с помощью логического значения. - person Bart Friederichs; 15.12.2014
comment
почему бы и нет ? если вы ищете краткий способ написать это, вы можете, в противном случае используйте простой, если еще или переключатель - person Luca Rocchi; 15.12.2014

Я не знаю, будет ли этот способ лучше, но вы можете создать функцию и использовать «return» для оптимизации сравнений:

function cond( $conditionsOne, $conditionsTwo )
{
    if( $conditionsOne && !$conditionsTwo ) return 'one';
    if( $conditionsOne ) return 'two';
    if( $conditionsTwo ) return 'three';
    return 'four';
}

$foo = cond( $conditionsOne, $conditionsTwo );
person manuelbcd    schedule 15.12.2014