使用短路来获得第一个非空变量

时间:2011-11-20 18:44:34

标签: php short-circuiting

在PHP中,以下(基于JS风格)的等价物是什么:

echo $post['story'] || $post['message'] || $post['name'];

如果故事存在则发布;或者如果消息存在,等等......

8 个答案:

答案 0 :(得分:38)

这将是(PHP 5.3 +)

echo $post['story'] ?: $post['message'] ?: $post['name'];

PHP 7

echo $post['story'] ?? $post['message'] ?? $post['name'];

答案 1 :(得分:16)

有一个单行,但它并不完全短:

echo current(array_filter(array($post['story'], $post['message'], $post['name'])));

array_filter会从备选列表中返回所有非空条目。而current只是从过滤后的列表中获取第一个条目。

答案 2 :(得分:6)

由于or||都没有返回其中一个不可能的操作数。

你可以为它编写一个简单的函数:

function firstset() {
    $args = func_get_args();
    foreach($args as $arg) {
        if($arg) return $arg;
    }
    return $args[-1];
}

答案 3 :(得分:5)

基于Adam的答案,您可以使用错误控制运算符来帮助抑制未设置变量时生成的错误。

echo @$post['story'] ?: @$post['message'] ?: @$post['name'];

http://php.net/manual/en/language.operators.errorcontrol.php

答案 4 :(得分:4)

从PHP 7开始,您可以使用null coalescing operator

  

空合并运算符(??)已添加为语法糖   对于需要使用三元组的常见情况   isset()函数。它返回第一个操作数(如果存在且不为NULL);   否则它返回第二个操作数。

// Coalescing can be chained: this will return the first
// defined value out of $_GET['user'], $_POST['user'], and
// 'nobody'.
$username = $_GET['user'] ?? $_POST['user'] ?? 'nobody';

答案 5 :(得分:1)

如果设置了这些语法并且不是false,则该语法将回显1,如果不是,则返回0。

这是一种有效的方法,可以扩展到任意数量的选项:

    echo isset($post['story']) ? $post['story'] : isset($post['message']) ? $post['message'] : $post['name'];

......虽然很难看。编辑:马里奥比我更好,因为它尊重你选择的任意顺序,但不像这样,它不会让你添加的每个新选项变得更加丑陋。

答案 6 :(得分:1)

你可以尝试一下

<?php
    echo array_shift(array_values(array_filter($post)));
?>

答案 7 :(得分:1)

因为多样性是生活的调味品:

echo key(array_intersect(array_flip($post), array('story', 'message', 'name')));