使用switch来比较PHP中数组中的多个值

时间:2009-11-25 04:26:26

标签: php coding-style

我最近发现了一种情况,其中我有两个相关变量,如果这两个变量是六个排列中的一个,我想要做几个排列。

作为变量数据范围的一个例子:

$months = array('January', 'February', 'March', 'April', 'May', 'June', 'July',
    'August', 'September', 'October', 'November', 'December');
$days = array('Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday');

$month = $months[array_rand($months)];
$day = $days[array_rand($days)];
$week = rand(1, 4);

我想到的是一个简单的数组切换比较,如下所示:

function checkInputForCriteria($month, $day, $week)
{
    switch (array($month, $day))
    {
        case array('January', 'Wednesday'):
        case array('February', 'Monday'):
        case array('April', 'Tuesday'):
        case array('July', 'Saturday'):
        case array('September', 'Thursday'):
        case array('September', 'Tuesday'):
            return (in_array($week, array(1, 2)));
    }

    return FALSE;
}

通常这将写成:

function checkInputForCriteria($month, $day, $week)
{
    if (
        ($month == 'January' && $day == 'Wednesday')
        || ($month == 'February' && $day == 'Monday')
        || ($month == 'April' && $day == 'Tuesday')
        || ($month == 'July' && $day == 'Saturday')
        || ($month == 'September' && $day == 'Thursday')
        || ($month == 'September' && $day == 'Tuesday')
    )
    {
        return ($week == 1 || $week == 2);
    }

    return FALSE;
}

虽然我意识到switch-case-array方法并不常用,但我没有看到任何编码标准的理由不使用它。 PHP完全按照它的外观比较数组中每个元素中的数据没有问题。它是紧凑的,具有值数组元素和每个比较数组元素之间的直接顺序关系。我可以看到不使用此方法的唯一原因是它是CPU还是内存密集型(我还没有测试过)。

基于编码标准的含义,你会在自己的代码中接受这种用法吗?如果你在别人的代码中看到这个,只是浏览它,你会不会理解发生了什么?

如果不允许这种类型的结构只是因为它不是我们通常看到/期望的那样,那么引入一个结构来比较上述例子中必要的数据的方法是什么?基本的if语句是唯一可以接受的比较数据以做出逻辑决策的方法吗?

1 个答案:

答案 0 :(得分:1)

在像PHP这样的语言中 - 很大程度上是在运行时解释 - 我认为这很好。实际上比“精细”更好:阵列开关简洁明了。

我认为不经常看到这样的事情的原因是像C ++或Java这样的语言不支持它们,因此探索这些解决方案的思维模式并没有得到很好的发展。当然,if形式将在C ++中更好地优化,即使在C ++中创建了大约写入的重载方法。