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

发布于 2024-12-17 06:16:39 字数 162 浏览 0 评论 0原文

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

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

所以如果故事存在,那么发布它;或者如果消息存在,等等......

What's the equivalent of the following (based in JS style) in PHP:

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

So if story exists then post that; or if message exist post that, etc...

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(8

浅唱々樱花落 2024-12-24 06:16:39

它将是(PHP 5.3+)

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

对于PHP 7

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

It would be (PHP 5.3+):

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

And for PHP 7:

echo $post['story'] ?? $post['message'] ?? $post['name'];
甜妞爱困 2024-12-24 06:16:39

有一个单行代码,但它并不短:

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

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

There is a one-liner for that, but it's not exactly shorter:

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

array_filter would return you all non-null entries from the list of alternatives. And current just gets the first entry from the filtered list.

疯到世界奔溃 2024-12-24 06:16:39

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

不过,您可以为其编写一个简单的函数:

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

Since both or and || do not return one of their operands that's not possible.

You could write a simple function for it though:

function firstset() {
    $args = func_get_args();
    foreach($args as $arg) {
        if($arg) return $arg;
    }
    return $args[-1];
}
高跟鞋的旋律 2024-12-24 06:16:39

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

空合并运算符 (??) 已作为语法糖添加
对于需要结合使用三元的常见情况
伊塞特()。如果第一个操作数存在且不为 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';

As of PHP 7, you can use the null coalescing operator:

The null coalescing operator (??) has been added as syntactic sugar
for the common case of needing to use a ternary in conjunction with
isset(). It returns its first operand if it exists and is not NULL;
otherwise it returns its second operand.

// 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';
疾风者 2024-12-24 06:16:39

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

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

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

Building on Adam's answer, you could use the error control operator to help suppress the errors generated when the variables aren't set.

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

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

似最初 2024-12-24 06:16:39

你可以尝试一下

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

You can try it

<?php
    echo array_shift(array_values(array_filter($post)));
?>
驱逐舰岛风号 2024-12-24 06:16:39

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

这是一种执行此操作的单行方法,该方法有效并且可以扩展为任意数量的选项:

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

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

That syntax would echo 1 if any of these are set and not false, and 0 if not.

Here's a one line way of doing this which works and which can be extended for any number of options:

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

... pretty ugly though. Edit: Mario's is better than mine since it respects your chosen arbitrary order like this does, but unlike this, it doesn't keep getting uglier with each new option you add.

翻身的咸鱼 2024-12-24 06:16:39

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

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

Because variety is the spice of life:

echo key(array_intersect(array_flip($post), array('story', 'message', 'name')));
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文