1

我一直在研究这个问题很长一段时间,终于创造了我的答案。

我有三个将输出不同值的数组键。每个键的条件要么为真,要么为 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....... 

到目前为止,这工作正常,涵盖了我需要涵盖的每个可能的变化。我想知道是否有更灵活的方法来做到这一点。例如,如果我想添加另一个数组值并比较集体的条件,那么这个解决方案不够灵活,无法做到这一点。我将不得不完全重写开关的情况,尽管这是不可避免的,是否有更有效的方法来做到这一点。我对 PHP 完全陌生,但我在 OOP 上读过一些内容,我只是想知道 OOP 的做法是什么。为了更清楚我想要实现的目标。

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

有没有更灵活的方法来做到这一点?

问候

w9914420

4

2 回答 2

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'])];
于 2013-05-07T19:46:07.553 回答
0

您要做的是找到 3 个案例的所有二进制组合。现在你有 3 个键,它们可以是 true 或 null。所以你有 2x2x2 = 8 种组合。

第一步是评估每个案例的数量。例如 FFT = 1、FTT=3、TTT = 7 等。

例如 case $a['Font'] == NULL && $a['Font2'] == NULL && $a['Font3'] == NULL: = FFF 因为在所有情况下值都是 NULL,所以 value 评估到 000 = 0 十进制。

$a['Font'] && $a['Font2'] == NULL && $a['Font3'] == NULL: = TFF,计算结果为 100=4 十进制。

这里的诀窍是每个字体都有不同的权重。Font3 是 1,Font2 是 2,Font3 是 4,Font4(for future) 是 8。

计算此值后,您可以匹配开关中的每种情况:

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

如果您有 4 个键,您仍然可以评估为 FFFT=1、FFTF = 2 等。开关将保持不变,只需要添加额外的案例。

于 2013-05-07T19:52:43.820 回答