2013-05-07 63 views
1

我一直在寻找这个问题很长一段时间,并最终创建了我的答案。比较数组键值以确定条件语句的OOP方式?

我有三个数组键会输出不同的值。每个键的条件将是真或NULL,这就是我测试我的数组很简单,看起来像这样。

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

我想,如果一个键为null,则输出将是不同的,那么如果我有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....... 

到目前为止,这工作得很好,涵盖了我需要覆盖的每个可能的变化。我想知道是否有更灵活的方法来做到这一点。例如,如果我想添加另一个数组值并比较集合的条件,那么此解决方案不够灵活。我将不得不完全重写交换机的情况,尽管这是不可避免的,还有更有效的方法。我完全陌生的PHP,但我已经读了一些关于面向对象,我只是想知道这是做OOP的方式是什么。更清楚我想要达到的目标。

// 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

嗨Barmar我不知道你是否可以提供一小段代码,以便我能更好地理解你的概念。 – W9914420 2013-05-08 17:09:42

+0

我不知道你的需要比我的答案中的片段还多。您只需填写所需的所有值,然后按照我的说明访问它。你可能想把它包装在一个函数中。 – Barmar 2013-05-08 18:08:57

+0

嗨Barmar,我明白你的意思,然后我可以在case语句中使用函数输出。谢谢! – W9914420 2013-05-09 21:30:51

0

你是什么试图做的是找到所有3种情况的二进制组合。现在你有3个键,可以是true或null。所以你有2x2x2 = 8种组合。

第一步将评估每个案件的编号。例如FFT = 1,FTT = 3,TTT = 7等

例如壳体$ A [ '字体'] == NULL & & $一个[ 'Font2'] == NULL & & $一个[” Font3'] == NULL:= FFF,因为在所有情况下,该值都是NULL,所以值的计算结果为000 = 0十进制。

$ A [ '字体'] & & $一个[ 'Font2'] == NULL & & $一个[ 'Font3'] == NULL:= TFF,其计算结果为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

嗨Aris我不知道你会怎么去连接阵列到二进制组合翻译。是否有可能只需要一小段代码,以便我可以更好地形象化你的表情。谢谢 – W9914420 2013-05-08 17:08:52

+0

@ W9914420我更新了我的答案。希望这可以帮助。 – Aris 2013-05-08 19:33:01

+0

谢谢阿里斯我明白你的意思 – W9914420 2013-05-08 20:45:46