25

PHP 中的以下内容(基于 JS 样式)的等价物是什么:

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

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

4

8 回答 8

42

它将是(PHP 5.3+)

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

对于PHP 7

echo $post['story'] ?? $post['message'] ?? $post['name'];
于 2013-07-05T07:26:45.830 回答
17

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

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

array_filter将从备选列表中返回所有非空条目。并且current只是从过滤列表中获取第一个条目。

于 2011-11-20T18:52:22.773 回答
6

由于两者or都不||返回它们的操作数之一,这是不可能的。

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

function firstset() {
    $args = func_get_args();
    foreach($args as $arg) {
        if($arg) return $arg;
    }
    return $args[-1];
}
于 2011-11-20T18:46:48.667 回答
5

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

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

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

于 2016-03-10T23:22:41.237 回答
5

从 PHP 7 开始,您可以使用null 合并运算符

已添加空合并运算符 (??) 作为语法糖,用于需要将三元组与 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';
于 2016-02-25T08:53:32.610 回答
1

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

echo key(array_intersect(array_flip($post), array('story', 'message', 'name')));
于 2011-11-21T01:21:30.730 回答
1

如果设置了其中任何一个且不为假,则该语法将回显 1,否则回显 0。

这是一种可行的方法,可以扩展为任意数量的选项:

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

……虽然很丑。编辑:马里奥的比我的好,因为它尊重您选择的任意顺序,但与此不同的是,它不会随着您添加的每个新选项而变得越来越丑陋。

于 2011-11-20T18:55:08.900 回答
1

你可以试试

<?php
    echo array_shift(array_values(array_filter($post)));
?>
于 2011-11-20T19:03:18.600 回答