这三元是否有效?

时间:2012-12-04 09:40:56

标签: php if-statement ternary-operator

我正在使用三元if语句,因为我不能使用switch进行以下操作,但是,有更好的方法吗?我最近读到这些可能是资源匮乏的? (这可以在页面中多次调用)

$filter= (
    ($price_check > '0' && $price_check < '20.01') ? '020' : 
    (($price_check > '20.00' && $price_check < '50.01') ? '2050' :
    (($price_check > '50.00' && $price_check < '100.01') ? '50100' :
    (($price_check > '100.00' && $price_check < '200.01') ? '100200' :
    (($price_check > '200.00' && $price_check < '500.01') ? '200500' :
    (($price_check > '500.00') ? '501' : '0'
))))));

4 个答案:

答案 0 :(得分:8)

谈论三元运算符的“效率”是一个红色的鲱鱼。它的速度并不重要,如果将代码放在计算绑定应用程序的内部循环中(这几乎肯定不是),它可能仍然无关紧要。

应该提出的问题是“六个月后,当我需要做出改变时,我是否想在我面前找到这个?”。

应始终将可维护性作为经验。如果您不知道此代码确实是瓶颈的事实,您应该尽可能方便地编写它。

因此,您可能会考虑性能较差但更易于维护的替代样式,例如:

$data = array(
    '0'      => '020',
    '20.00'  => '2050',
    '50.00'  => '50100',
    // ...
);

$price_check = '...';
$filter = '0'; // default value
foreach ($data as $floor => $value) {
    if ($floor > $price_check) break;
    $filter = $value;
}

答案 1 :(得分:2)

只是想指出你可以简化你的范围检查,每个“elseif”的下限是不必要的,因为如果匹配它就不会调用下一个测试条件:

$filter = (
     $price_check <= 0   ? '0' :
    ($price_check <= 20  ? '020' : 
    ($price_check <= 50  ? '2050' :
    ($price_check <= 100 ? '50100' :
    ($price_check <= 200 ? '100200' :
    ($price_check <= 500 ? '200500' : 
    '501'
))))));

答案 2 :(得分:2)

在今天的计算中,除非您在嵌入式系统领域工作,人工时间远比计算机时间更有价值:a计算机将采取几纳秒的方式,瓶颈将在其他地方(更可能在网络传输)。相反,您应该问问自己,以这种方式编写的代码是否更容易为您理解与否。

同时请记住,随着语言的改进,今天的效率不高,明天可能会更好。

答案 3 :(得分:0)

(是的,我知道这个问题已经很久了,但感觉要加入我自己的两分钱。)虽然有很多方法可以给猫皮肤。我想发布一些我做过多次测试的观察结果。您也可以在http://3v4l.org/(在线PHP&amp; HHVM Shell)上应用相同的测试和/或应用它们。要测试你应该运行多个来正确评估差异。在测试中,我接受了WebChemist的回应并将其撤消了。为什么?有时玩游戏很有趣。然而,实际结果显示三元整体有微观改善。使用各种输入值。

$price_check = '...';

$filter = (
    ( $price_check > '500') ? '501'     : 
    (($price_check > '200') ? '200-500' :
    (($price_check > '100') ? '100-200' :
    (($price_check > '50')  ? '50-100'  :
    (($price_check > '20')  ? '20-50'   :
    (($price_check > '0')   ? '0-20'    : 
    '0'
))))));

然后,虽然下一个例子可以得到更好的改进,但它只是一个例子。所以不要把它判断为生产水平。这只是三元和if / else之间的一个想法。总体而言,if / else的性能优于三元应用。主要做了这个测试,因为我总是读两端,三元更容易阅读,或者if / else更容易阅读。我说两者都可以在下面的例子中提供。最后,我真的相信你使用的一个或哪个取决于具体情况。至于这些数据与过滤价格之间的关系。 if / else最终在速度上超过了三元组。它也很容易阅读(我认为)。最后它的所有微型爵士乐如此真的无关紧要。那些不同意的人可以在自己的环境中进行自己的测试,或者去提供的网站。有时比在互联网上相信单词更好。我在我自己的环境(也就是那个网站)上进行了很多测试,以得出一些基本结论。我仍然喜欢用三元和if / else参数阅读。一些好的读取浮动在网络上。此外,如果在示例中通过真正的错误你。过去它不会影响性能,甚至整体返回使用此代码更快。您可以在转义中编码,或者完全重构它。

$price_check = '...';

    $filter='501';
    if($price_check > '500' || $filter='200-500')
    if($price_check > '200' || $filter='100-200')
    if($price_check > '100' || $filter='50-100' )
    if($price_check > '50'  || $filter='20-50'  )
    if($price_check > '20'  || $filter='0-20'   )
    if($price_check <= '0') $filter=0;

我想补充一点,如果数据中等大小,Jon对阵列的建议可能是最好的。三元和if / else可以处理大多数基本巢。温和推荐列表。应该将更多内容推送到数据库并进行访问。另外我稍微修改了Jon的代码。 (如果您 深入 嵌套三元组,而if / else通过数据库存在问题。)

$data = '20.00';
$range = '';

$arr = [
    '0',
    '20'  => '0-20',
    '50'  => '20-50',
    '100' => '50-100',
    '200' => '100-200',
    '500' => '200-500'
];

foreach ($arr as $floor => $value) {
    $range = $value;
    if ($floor >= $data)break;
} echo $range;