PHP定义var = one或其他(又名:$ var =($ a || $ b);)

时间:2015-06-15 04:29:52

标签: php variables operators

有没有办法将php变量定义为一个或另一个,就像你在javascript中var x = (y||z)一样?

Get the size of the screen, current web page and browser window

var width = window.innerWidth
|| document.documentElement.clientWidth
|| document.body.clientWidth;

var height = window.innerHeight
|| document.documentElement.clientHeight
|| document.body.clientHeight;

我发送了一个post变量,我希望将其存储起来供以后在会话中使用。我想要完成的是将$x设置为$_POST['x']的值,如果存在,则检查并使用$_SESSION['x'](如果存在)并且如果两者都未定义$x它们已经确定;

$x = ($_POST['x'] || $_SESSION['x');

根据http://php.net/manual/en/language.operators.logical.php

  

$ a = 0 || '阿瓦克&#39 ;;打印" A:$ a \ n&#34 ;;

     

将打印:

     

A:1

     PHP中的

- 而不是打印" A:avacado"就像在一个   像Perl或JavaScript这样的语言。

     

这意味着您无法使用' ||'运算符设置默认值:

     

$ a = $ fruit || '苹果&#39 ;;

     相反,你必须使用'?:'操作者:

     

$ a =($ fruit?$ fruit:' apple');

所以我必须使用额外的,如果封装?:操作如下:

if($_POST['x'] || $_SESSION['x']){ 
  $x = ($_POST['x']?$_POST['x']:$_SESSION['x']);
}

或同等的工作:

if($_POST['x']){
  $x=$_POST['x'];
}elseif($_SESSION['x']){
  $x=$_SESSION['x'];
}

我没有测试这些论文,但我认为它们也会起作用:

$x = ($_POST['x']?$_POST['x']:
       ($_SESSION['x']?$_SESSION['x']:null)
     );

对于更多变量,我会选择一个函数(未测试):

function mvar(){
  foreach(func_get_args() as $v){
    if(isset($v)){
      return $v;
    }
  } return false;
}

$x=mvar($_POST['x'],$_SESSION['x']);

在php中实现相同的任何简单方法吗?

编辑澄清:在我们想要使用许多变量$x=($a||$b||$c||$d);

的情况下

5 个答案:

答案 0 :(得分:2)

是的,您需要使用您在示例中使用的简单ternary运算符以及PHP的其他一些函数,例如PHP的issetempty函数。因此,您的变量$x将分别赋值

示例

$x = (!empty($_POST['x'])) ? $_POST['x'] : (!empty($_SESSION['x'])) ? $_SESSION['x'] : NULL;

因此,上述函数描述了如果您的$_POST['x']设置为

的值
$x = $_POST['x'];

否则它会检查$_SESSION的下一个值,如果它的设置然后$x的值将是

$x = $_SESSION['x'];

否则最后的值将是

$x = null;// you can set your predefined value instead of null

$x = (!empty($a)) ? $a : (!empty($b)) ? $b : (!empty($c)) ? $c : (!empty($d)) ? $d : null;

如果您需要一个功能,那么您可以简单地实现它

$a = '';
$b = 'hello';
$c = '';
$d = 'post';

function getX(){
    $args = func_get_args();
    $counter = 1;
    return current(array_filter($args,function($c) use (&$counter){ if(!empty($c) && $counter++ == 1){return $c;} }));
}

$x = getX($a, $b, $c, $d);
echo $x;

答案 1 :(得分:2)

更新

我设法为你创造了一个能够达到你想要的功能的功能,允许你提供无限的争论和提取:

function _vars() {
    $args = func_get_args();
    // loop through until we find one that isn't empty
    foreach($args as &$item) {
        // if empty
        if(empty($item)) {
            // remove the item from the array
            unset($item);
        } else {
            // return the first found item that exists
            return $item;
        }
    }
    // return false if nothing found    
    return false;
}

要理解上述功能,请阅读上述评论。

用法:

$a = _vars($_POST['x'], $_SESSION['x']);

这是你的:

Example

这是一个非常简单的三元操作。您只需要先检查帖子,然后在以下后检查会话:

$a = (isset($_POST['x']) && !empty($_POST['x']) ? 
        $_POST['x']
        :
        (isset($_SESSION['x']) && !empty($_SESSION['x']) ? $_SESSION['x'] : null)
    );

答案 2 :(得分:1)

更简单的方法是创建一个可以接受变量的函数。

 public function getFirstValid(&...$params){
    foreach($params as $param){
        if (isset($param)){
            return $param;
        }
    }
    return null;
 }

然后初始化一个我想做的变量......

var $x = getFirstValid($_POST["x"],$_SESSION["y"],$_POST["z");

结果将是var x将分配设置的第一个变量,或者如果没有设置任何变量,则设置为null。

说明:

函数getFirstValid接受可变数量的变量指针(& ...)并循环检查是否设置,将返回遇到的第一个变量。

答案 3 :(得分:1)

PHP 7解决方案: ??运算符。 $x = expr1 ?? expr2

  • 如果存在expr1,则$ x的值为expr1,并且不为NULL。
  • 如果expr1不存在或为NULL,则$ x的值为expr2。

https://www.php.net/manual/en/migration70.new-features.php#migration70.new-features.null-coalesce-op

答案 4 :(得分:0)

这很简单 -

$x = (!empty($_POST['x']) ? $_POST['x'] :
          (!empty($_SESSION['x']) ? $_SESSION['x'] : null)
     );