0

我正在使用三元 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

4 回答 4

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;
}
于 2012-12-04T09:44:08.230 回答
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'
))))));
于 2012-12-04T09:49:04.670 回答
2

在当今的计算中,除非您在嵌入式系统领域工作,否则人的时间远比计算机时间更有价值:一台计算机无论哪种方式都需要几纳秒,而瓶颈将在其他地方(更有可能在网络传输中) . 相反,您应该问自己,以这种方式编写的代码是否更容易理解

还要记住,今天效率不高的陈述,明天可能会更好,因为语言得到改进。

于 2012-12-04T09:52:08.403 回答
0

(是的,我知道这个问题已经过时了,但我觉得要在其中添加我自己的两分钱。)虽然有很多方法可以给猫剥皮。我觉得要发布一些我在运行多次测试时所做的观察。您也可以应用相同的测试和/或在http://3v4l.org/(在线 PHP 和 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;
于 2014-08-03T18:32:56.893 回答