【问题标题】:Is there a way to refactor multiple similar PHP ternaries?有没有办法重构多个相似的 PHP 三元组?
【发布时间】:2019-12-21 06:01:50
【问题描述】:

我有一些代码,感觉里面有很多重复。我把它归结为以下部分,但我仍然看到一些重复的东西,感觉应该有一种更简洁的方式来编写它。还有什么可以做的吗?还是这样?

$w1 = ($fin[57] > $fin[60]) ? $tc[57] : $tc[60];
$l1 = ($fin[57] > $fin[60]) ? $tc[60] : $tc[57];
$w2 = ($fin[58] > $fin[59]) ? $tc[58] : $tc[59];
$l2 = ($fin[58] > $fin[59]) ? $tc[59] : $tc[58];

我真正想要的是,如果有办法让三元组返回一个真假值数组。像这样的虚构代码:

list($w1, $l1) = (array) ($fin[57] > $fin[60]) ? $tc[57] : $tc[60];
list($w2, $l2) = (array) ($fin[58] > $fin[59]) ? $tc[58] : $tc[59];

【问题讨论】:

  • 更多上下文会有所帮助。我们能看到这个算法应该解决的更大的问题吗?也许完全不同的方法可以使这些行完全过时。
  • @deceze - 在此$fin 表示游戏方 id #57 的最终得分,等等。$tc 表示玩该方的团队的 id(将“方”视为“家”或“离开”)。所以在日程表上有一场比赛,#57 打#60。获得第 57 名的团队分配有$tc[57]。该游戏获胜者的团队 ID 被分配给 $w1 变量。不确定该解释是否有助于或使其更加混乱。最终,$w1 团队将进入游戏方 id #61。但这对于这个问题可能并不重要。

标签: php


【解决方案1】:

您可以使用list 让它变得更好一点:

$order = function ($i1, $i2) use ($fin, $tc) {
    $r = [$tc[$i1], $tc[$i2]];
    if ($fin[$i2] > $fin[$i1]) $r = array_reverse($r);
    return $r;
};
list($w1, $l1) = $order(57, 60);
list($w2, $l2) = $order(58, 59);

【讨论】:

  • 如果这两个变量不是global...?
  • @deceze 本来是为了展示这个想法,但现在应该修复了。
  • 嗯,如果我有很多实例,这个想法可能会很好,但我只有两个比较。我刚刚编辑了我的问题以显示我希望得到的那种答案的伪代码。
  • @DanGoodspeed 我不认为有更短的方法。
【解决方案2】:

我相信没有函数你能做的最短的就是这个,但仍然有相当多的重复:

[$w1, $l1] = $fin[57] > $fin[60] ? [$tc[57], $tc[60]] : [$tc[60], $tc[57]];

如果您正在使用 PHP 7.4 的短闭包,您还可以执行一个非常小的函数(PHP

$wlValues = fn($i, $j) => $fin[$i] > $fin[$j] ? [$tc[$i], $tc[$j]] : [$tc[$j], $tc[$i]];

用法:

[$w1, $l1] = $wlValues(57, 60);

【讨论】:

    猜你喜欢
    • 2023-03-31
    • 2020-09-27
    • 1970-01-01
    • 1970-01-01
    • 2020-02-18
    • 2018-02-02
    • 1970-01-01
    • 1970-01-01
    • 2016-12-29
    相关资源
    最近更新 更多