2013-05-07 3 views
1

Я искал эту проблему довольно давно и, наконец, создал свой ответ.Сравнение значений ключа Array для определения условных операторов методом ООП?

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

$a = array(); 
$a['Font'] = logix::templateParams('googleWebFont'); 
$a['Font2'] = logix::templateParams('googleWebFont2'); 
$a['Font3'] = logix::templateParams('googleWebFont3'); 

Я хотел создать выход в зависимости от коллективного состояния всех трех клавиш, например , если один ключ является недействительным, то результат будет отличаться, то если у меня было 2 ключа «NULL». Мне удалось создать простой переключатель, который охватывал диапазон значений, которые мне нужны для покрытия моего кода, выглядит так.

$a = array(); 
$a['Font'] = logix::templateParams('googleWebFont'); 
$a['Font2'] = logix::templateParams('googleWebFont2'); 
$a['Font3'] = logix::templateParams('googleWebFont3'); 

switch (TRUE){ 


    // No font selected 
    case $a['Font'] == NULL && $a['Font2'] == NULL && $a['Font3'] == NULL: 
     echo 'nothing'; 
     break; 
    // First googlefont selected only 
    case $a['Font'] && $a['Font2'] == NULL && $a['Font3'] == NULL: 
     echo 'one'; 
     break; 
    // Second googlefont selected only 
    case $a['Font2'] && $a['Font'] == NULL && $a['Font3'] == NULL: 
     echo 'two'; 
     break; 
    // Third googlefont selected only 
    case $a['Font3'] && $a['Font2'] == NULL && $a['Font'] == NULL: 
     echo 'three'; 
     break; 

    // and Continues to cover another 10 more states....... 

До сих пор это прекрасно работает и охватывает все возможные варианты, которые мне необходимо покрыть. Мне было интересно, есть ли более гибкий способ сделать это. Например, если бы я хотел добавить другое значение массива и сравнить состояние коллектива, то это решение недостаточно гибко для этого. Я должен был бы полностью переписать случай с коммутатором, хотя это неизбежно, есть более эффективный способ сделать это. Im совершенно новый для PHP, но я немного читал о ООП, и я просто задавался вопросом, каким будет способ ООП. Чтобы быть более ясным, чего я пытаюсь достичь.

// 1. collect the array keys 
// 2. evaluate keys and check for certain conditions 
// 3. output based on conditions 

Есть ли более гибкий способ сделать это?

рассматривает

w9914420

ответ

0

Используйте многомерную таблицу, где размеры соответствуют шрифтам, а индексы соответствуют ли установить этот шрифт:

$font_table = array(array(array('nothing', 'one'), 
          array('two', 'three')), 
        array(array('four', 'five'), 
          array('six', 'seven'))); 

echo $font_table[!empty($a['Font3'])][!empty($a['Font2'])][!empty($a['Font'])]; 
+0

Привет, Бармар. Интересно, можете ли вы предоставить только фрагмент кода, чтобы я мог лучше понять вашу концепцию. – W9914420

+0

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

+0

привет Бармар, я понимаю, что вы имеете в виду, тогда я мог бы использовать вывод функции в case case. благодаря! – W9914420

0

Что вы пытаясь найти все бинарные комбинации из 3-х случаев. Теперь у вас есть 3 ключа, которые могут быть истинными или нулевыми. Таким образом, вы имеете 2x2x2 = 8 комбинаций.

Первым шагом будет оценка каждого случая с его номером. Например, FFT = 1, FTT = 3, 7 = TTT т.д.

Для примера случае $ а [ 'Font'] == NULL & & $ а [ 'Font2'] == NULL & & $ а [» Font3 '] == NULL: = FFF, так как во всех случаях значение равно NULL, поэтому значение оценивается как 000 = 0 десятичное.

$ а [ 'Font'] & & $ а [ 'Font2'] == NULL & & $ а [ 'Font3'] == NULL: = ФАТ, который оценивает 100 = 4 знака после запятой.

Фокус в том, что каждый шрифт имеет разный вес. Font3 является 1, Font2 2, Font3 4, Font4 (для будущего) составляют 8.

После расчета этих значений, вы можете сопоставить каждый случай в коммутаторе:

case '0': 
    echo 'nothing'; 
    break; 
    // First googlefont selected only 
    case '1': 
    echo 'one'; 
    break; 

Если же у вас есть 4 ключа, вы все равно можете оценить как FFFT = 1, FFTF = 2 и т. Д. Коммутаторы останутся неизменными и должны добавить дополнительные случаи.

+0

Hi Aris Im не уверен, как вы собираетесь подключать массив к преобразованию двоичной комбинации. Можно ли запросить только фрагмент кода, чтобы я мог лучше визуализировать ваше выражение. спасибо – W9914420

+0

@ W9914420 Я обновил свой ответ. надеюсь это поможет. – Aris

+0

Спасибо Арис Я понимаю, что вы имеете в виду – W9914420

Смежные вопросы