【问题标题】:Simplify multiple nested if()'s简化多个嵌套的 if()
【发布时间】:2022-06-24 12:35:05
【问题描述】:

有人可以帮我简化这个复杂的嵌套if() 的算法吗?我知道它可以简化,但如果我相信自己,我怕我会搞砸多个条件。

$groups = array();

foreach ($items as $item) {
    if ($item['group_code']) {
        if (array_key_exists($item['group_code'], $groups)) {
            if (mb_strlen($groups[$item['group_code']]) < mb_strlen($item['title'])) {
                $groups[$item['group_code']] = $item['title'];
            }
        } else {
            $groups[$item['group_code']] = $item['title'];
        }
    } else {
        $groups[$item['item_code']] = $item['title'];
    }
}

我想要的是在$groups 中创建产品标题索引。如果每个项目都存在group_code 键,那么我想存储属于该组的所有项目的较长标题。如果group_code 不存在(意味着它是单个产品而不是分组产品),我想使用item_code 存储该项目的标题(这是最简单的条件,这里不需要长度比较)。

【问题讨论】:

  • 看起来最里面的else 缺少if
  • @IłyaBursov 不,它没有! if (mb_strlen($groups[$item['group_code']]) &gt;= mb_strlen($item['title'])) 那么什么都不会发生!
  • @FayeD。 “如果答案解决了您的问题,请考虑接受答案。这是How does accepting an answer work?。然后返回此处并使用勾选/复选标记执行相同操作,直到它变为绿色。这会通知社区,找到了解决方案。否则,其他人可能认为问题仍然悬而未决,可能想发布(更多)答案。您将获得积分,并鼓励其他人帮助您。

标签: php conditional-statements nested-if


【解决方案1】:

先检查else 条件怎么样?

foreach ($items as $item) {
    if (!isset($item['group_code'])){
        $groups[$item['item_code']] = $item['title'];
    } else if (!array_key_exists($item['group_code'], $groups)){
        $groups[$item['group_code']] = $item['title'];
    } else if (mb_strlen($groups[$item['group_code']]) < mb_strlen($item['title'])){
        $groups[$item['group_code']] = $item['title'];
    }
}

【讨论】:

  • 我想我会选择这条路线,因为它发现它的复杂性与我的非常相似,但这条路线更紧凑。一旦我检查它产生与我相同的结果,我会将其标记为解决方案。
  • 你可以进一步简化这个。
【解决方案2】:

我会像这样简化它(php 7+):

foreach ($items as $item) {
    $t = $item['title'];
    $c = $item['group_code'] ?? $item['item_code'];
    if (mb_strlen($t) > mb_strlen($groups[$c] ?? '')) $groups[$c] = $t;
}

【讨论】:

  • 这里已经很晚了,所以我无法弄清楚你的算法,因为我的眼睛已经闭上了,但明天我会更仔细地研究它。虽然它看起来比我的复杂一点(或者我的大脑太累了)。我会回来的!不管怎么说,还是要谢谢你! :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多