【问题标题】:Is there an efficient way to write this PHP if / else statement?有没有一种有效的方法来编写这个 PHP if / else 语句?
【发布时间】:2011-01-12 20:39:58
【问题描述】:

我为我的网络应用编写了一个简单的问题跟踪器。我有一些我想保密的 cmets(只有“root”角色才能看到它们)。有没有更好的方法来编写以下内容,所以我不需要空的 else 部分?

$role 将为 'root' 或其他一些值
$is_private 将为 true如果评论是私密的

<?php
// Don't show private comments to non-root users
if ($is_private && 'root' != $role):
    // NON Root cannot see private
else:
?>
<div class="comment <?= $is_private ? 'private' : '' ; ?>">
    <div class="comment-meta toolbar">
    <?= $is_private ? 'PRIVATE - ': ''; ?>
    <span class="datestamp"><?= $created_at; ?></span> - 
    <span class="fullname"><?= $fname . ' ' . $lname; ?></span></div>
    <p class="content"><?= nl2br($body); ?></p>

</div>
<?php endif; ?>

【问题讨论】:

    标签: php logic if-statement


    【解决方案1】:

    您需要做的就是反转条件:如果 cmets 不是私有的,或者 $role 是“root”,则它们是可见的。

    <?php
    // Don't show private comments to non-root users
    if (!$is_private || 'root' == $role):
    ?>
    <div class="comment <?= $is_private ? 'private' : '' ; ?>">
        <div class="comment-meta toolbar">
        <?= $is_private ? 'PRIVATE - ': ''; ?>
        <span class="datestamp"><?= $created_at; ?></span> - 
        <span class="fullname"><?= $fname . ' ' . $lname; ?></span></div>
        <p class="content"><?= nl2br($body); ?></p>
    
    </div>
    <?php endif; ?>
    

    【讨论】:

    • 是的!这很完美。谢谢,让另一组关注问题真的很有帮助。
    • @nvoyageur:你可能想复习De Morgan's lawsGumbo 指的是 - 这就是你进行这种重写的方式(而不仅仅是在条件周围拍打! )。
    【解决方案2】:

    您可以简单地反转整个表达式:

    if (!($is_private && 'root' != $role))
    

    或者你用De Morgan’s laws解决这个问题:

        !($is_private && 'root' != $role))
    <=>  !$is_private || !('root' != $role)
    <=>  !$is_private || 'root' == $role
    

    【讨论】:

      【解决方案3】:
      if (!$is_private || 'root' == $role):
      

      【讨论】:

      • 是的,这是正确的,但我必须将接受的答案提供给@Michael Madsen,他以 3 秒的优势击败了你 :)
      【解决方案4】:

      这可能是错误的,请参阅讨论

      if ($is_private &amp;&amp; 'root' == $role):

      【讨论】:

      • 这将只允许显示私有 cmets,并且仅当角色为“root”时。
      • 好吧,现在我觉得自己很愚蠢,这可能是因为我今天参加了一场大型考试,但我不明白为什么。据我所知,发布的代码只处理私人 cmets?如果 $is_private,并且 $role 不是 root,什么都不做,否则打印一堆东西?
      • 别觉得自己很蠢。你回答了 100%。如果不是私人的,他不是要向任何人展示 cmets,只是如何摆脱“其他”
      • @Nick:他在问如何以不同的方式编写代码以避免出现空块(或“节”,用他的话来说)。当前代码在 $is_private 为 false 或用户具有 root 角色时打印注释; $is_private &amp;&amp; 'root' == $role 只能用于从 if 和 else 中打印。
      【解决方案5】:

      我假设你的意思是更简洁的代码?

      如果是这样,把它放在一个函数中并调用它。

      function showPrivateComment($is_private, $role)
      {
          if($is_private && $role == 'root')
              return true;
          elseif(!$is_private)
              return true;
      
          return false;
      }
      

      【讨论】:

      • 不,不,不。只需要一个简单的逻辑反转。只有当我要一遍又一遍地使用逻辑时,函数才会有用。
      猜你喜欢
      • 2022-11-01
      • 1970-01-01
      • 2021-12-15
      • 1970-01-01
      • 1970-01-01
      • 2023-03-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多