在PHP语句中使用AND / OR


73

您如何在if else PHP语句中使用“ AND / OR”?可不可能是:

1)AND

if ($status = 'clear' AND $pRent == 0) {
    mysql_query("UPDATE rent 
                    SET dNo = '$id', 
                        status = 'clear', 
                        colour = '#3C0' 
                  WHERE rent.id = $id");
} 

2)或

if ($status = 'clear' OR $pRent == 0) {
    mysql_query("UPDATE rent 
                    SET dNo = '$id', 
                        status = 'clear', 
                        colour = '#3C0' 
                  WHERE rent.id = $id");
} 

这将如何工作? $items_list = array(2,177); $rules_list = array( '[(13 OR 3 OR 2 )]', '[(54 OR 77 ) AND 17 AND 59 AND 36 ] OR [(2 AND 36 )]', '[(2 OR 3 OR 13 ) AND 30 ]', '[(2 )] OR [(13 OR 4 ) AND (17 )]', '[(2 )] OR [(13 OR 3 ) AND 17 ]', '[(2 AND 30 ) OR (3 AND 30 )]', ); //计算使用所提供的项目每个规则的布尔结果array`
Bhargav帕特尔

Answers:


130

是。答案是肯定的。
http://www.php.net/manual/zh/language.operators.logical.php


不过有两件事:

  • 许多程序员更喜欢&&||而不是andand or,但是它们的工作原理相同(优先级安全)。
  • $status = 'clear'应该是$status == 'clear'=是分配,==是比较。

142
只是为了补全,===是为了进行类型+值比较。将来,PHP还包括====检查类是由同一位程序员编写的,=====以确保它们是在同一天编写的,并======确保程序员当时穿着裤子。
AgentConundrum 2010年

24
@Agent我要添加一点=============以确保自编写代码以来项目规范没有更改。
deceze

9
@deceze-好人,但前提是它总是返回FALSE
AgentConundrum 2010年

26
@AgentConundrum:!=====如果我想确保程序员穿裤子,我可以使用吗?
Asaph 2010年

29
@deceze:不穿裤子是互联网上某些最受欢迎网站的商业模式的核心。;)
Asaph 2010年

17

有点晚了,但是没关系...
问题是“您如何使用...?” 简短的答案是你做对了


另一个问题是“何时使用?”
我用&&代替AND||代替OR

$a = 1
$b = 3

现在,

if ($a == 1 && $b == 1) { TRUE } else { FALSE }

在这种情况下,结果为“ FALSE”,因为B不为1,现在如果

if ($a == 1 || $b == 1) { TRUE } else { FALSE }

即使B仍然不是我们要求的值,这也将返回“ TRUE”,还有另一种不使用OR / ||返回TRUE的方法。那将是XOR

if ($a == 1 xor $b == 1) { TRUE } else { FALSE }

在这种情况下,我们只需要我们的一个变量为true即可,但如果两个都为TRUE,则结果将为FALSE。

我希望这有帮助...

更多信息,请访问:http :
//www.php.net/manual/en/language.operators.logical.php


16

这里有一些玩笑和令人误解的评论,甚至答案中的部分错误信息。我想尝试改善它们:

首先,正如某些人指出的那样,您的代码中存在一个与问题相关的错误:

if ($status = 'clear' AND $pRent == 0)

应该是(请注意==而不是=第一部分):

if ($status == 'clear' AND $pRent == 0)

在这种情况下,在功能上等同于

if ($status == 'clear' && $pRent == 0)

其次,请注意,这些运算符(and or && ||)是短路运算符。这意味着,如果可以从第一个表达式确定确定答案,则永远不会评估第二个表达式。同样,这与上面的调试行无关紧要,但是在将这些运算符与赋值结合使用时,这非常重要,因为

第三and or和之间的真正区别在于&& ||它们的运算符优先级。尤其重要的是,&& ||优先级比赋值运算符(= += -= *= **= /= .= %= &= |= ^= <<= >>=)高,而优先级比赋值运算符and or低。因此,在结合使用赋值和逻辑评估的陈述中,选择哪个陈述很重要。

PHP页面上有关逻辑运算符的修改示例:

$e = false || true;

将评估为,true并将该值分配给$e,因为||其运算符优先级高于=,因此它的评估本质上是这样的:

$e = (false || true);

然而

$e = false or true;

将分配false$e(然后执行该or操作并求值true),因为它=具有比更高的运算符优先级or,本质上是这样评估的:

($e = false) or true;

这种歧义甚至存在的事实使很多程序员总是使用它&& ||,然后一切都可以像使用C之类的语言那样清晰地工作。逻辑运算,然后分配。

诸如Perl之类的某些语言经常使用类似于以下格式的这种构造:

$connection = database_connect($parameters) or die("Unable to connect to DB.");

从理论上讲,这会将数据库连接分配给$connection,或者如果连接失败(并且我们在这里假设函数将返回false在这种情况下求值的值),它将以错误消息结束脚本。由于短路,如果数据库连接成功,die()则永远不会评估。

一些允许这种构造的语言会在条件/逻辑语句中(例如Python)直接禁止分配,以反过来消除模糊性。

PHP允许同时使用这两种方法,因此您只需要学习一下两个选项,然后按照自己的意愿进行编码,但希望您会以一种或另一种方式保持一致。

如有疑问,只需添加一组括号即可消除所有歧义。这些将始终是相同的:

$e = (false || true);
$e = (false or true);

拥有所有这些知识,我更喜欢使用,and or因为我认为它使代码更具可读性。我只是有一条规则,不要将分配与逻辑评估结合在一起。但是在那一点上,这只是一种偏爱,而一致性在这里比选择哪一方更为重要。


完美的答案!
艾哈迈德·穆巴拉基'18

9

您在这里有2期。

  1. 使用==进行比较。您已经使用了=哪个用于分配。

  2. 使用&&了“与”和||为“或”。and并且or可以工作,但是它们是非常规的。


很少见,但也许他们想在这种情况下分配:P尽管我敢打赌他们没有。
alex 2010年

1
@alex:当然不是if ($status = 'clear' OR $pRent == 0) {。在这种情况下,第二个条件是无法达到的。这一定是一个错误。
Asaph 2010年

是的,绝对不可以OR
alex 2010年



2

为和您使用

if ($status = 'clear' && $pRent == 0) {
    mysql_query("UPDATE rent SET dNo = '$id', status = 'clear', colour = '#3C0' WHERE rent.id = $id");
} 

供您使用

if ($status = 'clear' || $pRent == 0) {
    mysql_query("UPDATE rent SET dNo = '$id', status = 'clear', colour = '#3C0' WHERE rent.id = $id");
} 

0

我想我在这里有些困惑。:)但似乎没有其他人..

您是否要求在这种情况下使用哪个?如果是,则“是”是正确的答案

如果您询问操作员的工作方式,那么

在php中,AND,&&OR,|| 将以相同的方式工作。如果您是编程新手,并且php是您的第一门语言,则我建议您使用AND和OR,因为它增加了可读性并减少了您再次检查时的困惑。但是,如果您已经熟悉任何其他语言,那么您可能已经熟悉了&&和||。操作员。


这根本是不正确的。AND / OR的优先级低于赋值的优先级,而&& / || 具有更高的优先级。经典示例:$e = false || true;vs $e = false or true;。第一个评估为true,第二个评估为false。
redreinard

0
<?php
$val1 = rand(1,4); 
$val2=rand(1,4); 

if ($pars[$last0] == "reviews" && $pars[$last] > 0) { 
    echo widget("Bootstrap Theme - Member Profile - Read Review",'',$w[website_id],$w);
} else { ?>
    <div class="w100">
        <div style="background:transparent!important;" class="w100 well" id="postreview">
            <?php 
            $_GET[user_id] = $user[user_id];
            $_GET[member_id] = $_COOKIE[userid];
            $_GET[subaction] = "savereview"; 
            $_GET[ip] = $_SERVER[REMOTE_ADDR]; 
            $_GET[httpr] = $_ENV[requesturl]; 
            echo form("member_review","",$w[website_id],$w);?>
        </div></div>

香港专业教育学院用“ &&”替换了“ else”,所以两个都放了……argh


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.