使用三元运算符在 php-isset 中使用函数

Posted

技术标签:

【中文标题】使用三元运算符在 php-isset 中使用函数【英文标题】:use functions in php-isset with ternary operator 【发布时间】:2013-10-16 12:28:21 【问题描述】:

简单的东西,

这没有任何问题:

$openMonday =  rtrim(chunk_split($result['opening_hours']['periods'][1]['open']['time'], 2, ':'), ':');
$business->openingTimes['monday']       = isset($openMonday) ? $result['opening_hours']['periods'][1]['open']['time'] : '';

但我不想为此写两行,因为那样我就必须在所有其他营业时间都这样做。

为什么我不能写

$business->openingTimes['monday']       = isset(rtrim(chunk_split($result['opening_hours']['periods'][1]['open']['time'], 2, ':'), ':')) ? $result['opening_hours']['periods'][1]['open']['time'] : '';

我总是收到期望变量的错误。如何通过三元运算符使用 isset 中的方法?

【问题讨论】:

如果您需要在所有其他营业时间都这样做,您应该尝试使用它!这样就可以写成两行了,调用的时候更简洁。 【参考方案1】:

这里的问题是isset() 不是一个真正的函数,而是一个语言结构,它要求它的参数是变量,否则它会发出语法错误。

另见手册条目:http://php.net/manual/en/function.isset.php

无论如何,正如@deceze 所说,您可能不想在这里使用isset(),因为它用于检查变量是否存在。

在这种情况下,你可以使用empty(),所以不要写

$openMonday =  rtrim(chunk_split($result['opening_hours']['periods'][1]['open']['time'], 2, ':'), ':');
$business->openingTimes['monday'] = isset($openMonday) ? $result['opening_hours']['periods'][1]['open']['time'] : '';

你可以的

$openMonday =  rtrim(chunk_split($result['opening_hours']['periods'][1]['open']['time'], 2, ':'), ':');
$business->openingTimes['monday'] = !empty($openMonday) ? $result['opening_hours']['periods'][1]['open']['time'] : '';

而且您不必担心不惜一切代价使其成为单线!而是创建一个函数,然后在需要时调用它...但是如果您仍然想内联,那么您可以这样做

$business->openingTimes['monday'] = !empty(rtrim(chunk_split($result['opening_hours']['periods'][1]['open']['time'], 2, ':'), ':')) ? $result['opening_hours']['periods'][1]['open']['time'] : '';

请记住,以上要求至少 PHP 5.5

最后,上面一行可以写成

$business->openingTimes['monday'] = !rtrim(chunk_split($result['opening_hours']['periods'][1]['open']['time'], 2, ':'), ':') ? $result['opening_hours']['periods'][1]['open']['time'] : '';

不需要isset() 也不需要empty()

【讨论】:

为什么投反对票?这回答了OP问题!在这种情况下,他/她不应该使用 isset() 是另一回事...... 如果 OP 走向完全错误的方向,您会发现建议他更新他的 PHP 版本而不是指出他走向错误的方向更有用? @deceze 恕我直言,这是另一回事,但这个答案本身并没有错:他问为什么 isset() 失败,我告诉了他。 @deceze 添加了一个更好的示例,它不使用 isset() 并解释了为什么它是错误的,就像你所做的那样。 为什么empty在这里更可取?【参考方案2】:

这里不需要issetisset 用于安全地测试是否......好吧......变量存在。知道你的变量存在,因为你在之前的行中声明它.如果你想把它合并到一行中,你甚至没有使用变量,你直接使用 value。您只想将值与 false 进行比较,您可以轻松地进行内联。

只需摆脱isset。并阅读The Definitive Guide To PHP's isset And empty。

【讨论】:

我理解你的意思,但这仍然不能回答我的问题,即如何通过使用 isset 中的函数将所有代码仅写在一行中,除了两行。因为,我不知道是否给出了 opening_hours 所以我想这样做:isset($result['opening_hours']['periods'][2]['open']['time']) ? $result['opening_hours']['periods'][2]['open']['time'] : ''; 但是,我得到了这种格式的数字0000 并且需要将其转换为 00:00 - 这就是为什么我在问。上面只是一个例子,它是如何工作的,但我不希望它工作。 请给出一个清晰的例子,说明您的数据是什么样子或可能是什么样子,以及您期望的结果是什么。如果我们要做的只是一个过于复杂的错误代码示例,那么就很难建议合适的代码来处理您的数据。【参考方案3】:

解决方案

    $business->openingTimes['monday']       = isset($result['opening_hours']['periods'][1]['open']['time']) ? rtrim(chunk_split($result['opening_hours']['periods'][1]['open']['time'], 2, ':'), ':') : '';

解释我做了什么。我问是否设置了变量,如果设置了,则使用方法 chunk_split 否则字符串将为空。

【讨论】:

以上是关于使用三元运算符在 php-isset 中使用函数的主要内容,如果未能解决你的问题,请参考以下文章

函数式编程(三元运算文件操作)

php中运用三元运算符比较三个数大小并从大到小输出

java 使用三元运算符和if-else获取两个和三个数中的最大值

JS使用三元运算符判断三个数中最大的数

您可以在 C# 本地函数中使用三元运算符吗?

如何使用 JavaScript 中的三元运算符更改函数中的 if else 语句?