【问题标题】:Comparing Array Key values to determin conditional statements the OOP way?比较数组键值以确定条件语句的 OOP 方式?
【发布时间】:2013-05-01 21:11:24
【问题描述】:

我研究这个问题已经有一段时间了,终于找到了我的答案。

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

【问题讨论】:

    标签: php arrays oop function switch-statement


    【解决方案1】:

    使用多维表,其中维度对应字体,索引对应是否设置字体:

    $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'])];
    

    【讨论】:

    • 嗨 Barmar 我想知道你是否可以只提供一个 sn-p 代码,以便我更好地理解你的概念。
    • 我不确定除了我的回答中的 sn-p 之外,您还需要什么。您只需在该表中填写您想要的所有值,然后按照我展示的方式访问它。您可能希望将其包装在一个函数中。
    • 嗨 Barmar,我明白你的意思,那么我可以在 case 语句中使用函数输出。谢谢!
    • 在您最初的问题中,您只是在回显这些值,switch 语句仅用于确定要回显的内容。我的回答完全跳过了 switch 语句,但如果你有其他事情要做,取决于它们,你可以使用 switch。或者你可以将关联数组放在这个数组中,然后从它们那里得到你需要的东西。
    • 我的价值观比我最初的问题稍微复杂,但它让我对数组的使用有了一些思考,你正确地提到我可以在没有开关的情况下做我需要做的事情。非常感谢!
    【解决方案2】:

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

    第一步是评估每个案例及其编号。例如 FFT = 1、FTT=3、TTT = 7 等

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

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

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

    计算完这些值后,你可以匹配你的 switch 中的每个 case:

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

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

    【讨论】:

    • 嗨 Aris 我不确定如何将数组连接到二进制组合转换。是否可以只要求一个 sn-p 代码,以便我可以更好地可视化您的表达。谢谢
    • 谢谢 Aris 我明白你的意思
    猜你喜欢
    • 2013-06-05
    • 1970-01-01
    • 1970-01-01
    • 2021-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-27
    相关资源
    最近更新 更多