0

以下はswitchが使えないので三項if文を使っていますが、何か良い方法はありませんか?私は最近、これらがリソースを消費する可能性があることを読みましたか? (これはページ内で複数回呼び出すことができます)

$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

三項演算子の「効率」について話すのはニシンです。それがどれほど高速であるかは問題ではありません。また、コードが計算バウンド アプリケーションの内側のループ内に配置されていても問題にならない可能性があります (これはほぼ確実に問題ではありません)。

あなたが問うべきことは、「6 か月後に変更が必要になったときに、これを目の前に見つけたいですか?」ということです。

経験則として、保守性は常に最優先されるべきです。このコードが実際にボトルネックであるという事実を知らない場合は、できるだけ便利に記述する必要があります。

そのため、次のような、パフォーマンスは劣るが保守しやすい別のスタイルを検討できます。

$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

(はい、この質問が古いことは知っていますが、自分の2セントをミックスに追加したいと感じました。) 猫の皮をむく方法はたくさんありますが。多数のテストを実行して行ったいくつかの観察を投稿するように感じました。同じテストを適用したり、 http: //3v4l.org/ (オンライン PHP および HHVM シェル) で適用したりすることもできます。テストするには、違いを正しく測定するために複数回実行する必要があります。テストでは、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 は、適用されたいずれかの三項よりも優れたパフォーマンスを発揮します。主にこのテストを行ったのは、私は常に両端で読んでいるため、3 進数の方が読みやすく、if/else の方が読みやすいからです。私は、両方とも以下の例で提供されているようにできると言います。結局のところ、どちらを使用するかは状況によって異なると私は本当に信じています。このデータに関する限り、フィルタリング価格の間です。if/else は、最終的に速度で 3 項を上回りました。また、かなり読みやすい(と思います)。最終的にはすべてがマイクロ ジャズなので、それほど重要ではありません。同意できない場合は、独自の環境で独自のテストを実行するか、提供されている Web サイトにアクセスしてください。インターネット上で言葉を信じるよりも良い場合があります。私は自分の環境とその Web サイトで多くのテストを実行し、いくつかの基本的な結論に達しました。私は今でも、三項引数と 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 に答える