如果一个为空白,如何将变量分配给两个字符串之一?

Posted

技术标签:

【中文标题】如果一个为空白,如何将变量分配给两个字符串之一?【英文标题】:How to assign a variable to one of two strings if one is blank? 【发布时间】:2012-02-10 23:35:27 【问题描述】:

我想知道为什么将字符串分配给$separator 不起作用:

$separator = $options['title-separator'] || ' | ';

在其他地方,$option 已分配给某些文本或空字符串。 (实际上,在我的现实生活中,它是一些文本,或者 FALSE,但无论哪种方式......)。 $separator 是 TRUE 而不是字符串。

以下内容完成了我想要的,但似乎不必要地冗长:

$separator = ( $s = $options['title-separator'] ) ? $s : ' | ';

我来自 javascript,这两个示例都有相同的结果,这对我来说似乎是合乎逻辑的。我需要了解关于 php 的哪些内容才有意义?现在,我只是对每个使用选项的地方都需要数百个额外字符感到恼火。

【问题讨论】:

为避免不必要的通知,请使用$seperator = isset($options['title-seperator'] ? $options['title-separator'] : ' | ';。但是,看不到它过于冗长的地方。最全面的说法是“如果键存在,使用对应的值,否则使用X” 【参考方案1】:

请参阅 PHP 5.3 合并函数 ?:

Coalesce function for PHP?

所以你可以写:

$separator = $options['title-separator'] ?: ' | ';

编辑:正如 KingCrunch 所说,您将收到此通知:

Notice: Undefined index: ...

,但前提是您已对系统进行了如此配置。

在我们的 PHP 代码库中,我们定义了一个自定义函数 coalesce(...),它返回 isset() 返回 true 的第一个备选方案。

【讨论】:

奖金信息,我喜欢!但是,是的,因为通知,我会传递它。【参考方案2】:

我想知道为什么将字符串分配给 $separator 不起作用

因为语言不是这样定义的......

|| 的定义运营商说 $a ||如果 $a 或 $b 为 TRUE,则 $b 返回 TRUE,而不是如果 $a 计算结果为 TRUE,则返回 $a。

【讨论】:

【参考方案3】:

第一

$seperator = isset($options['title-seperator'])
  ? $options['title-separator']
  : ' | ';

不是冗长的,它只是完整地表达了它告诉你的内容。但是,对于 PHP5.3,您可以使用快捷方式

$seperator = $options['title-seperator'] ?: ' | ';

但是你会收到很多关于未定义索引键的通知。我建议保留第一个示例。

另一个(在我看来)更干净的解决方案是引入默认值。而不是使用“原样”选项将它们与一组预定义值合并

$defaults = array(
  'title-separator' => ' | '
);
$options = array_merge ($defaults, $options);

现在您无需关心它,所有默认设置都集中在一处,而不是分散在您的代码中。

【讨论】:

您提到array_merge 是我第一次看到它。是的,我会利用它! …让我想,既然 PHP 对数组和对象的处理方式不同,那么对象是否有类似的功能?我做了一点戳,我必须创建一个类并使用扩展,是吗? (也许这是一个新问题)。干杯,谢谢。【参考方案4】:

你可以制作函数。

if(!function_exists('gettrue'))
  function gettrue()
    $args = func_get_args();
    foreach($args as $arg)
      if($arg) return $arg;
    

    return $arg;
    


$test = gettrue(false, 0, '', 'yes');
var_dump($test);  // string(3) "yes"

【讨论】:

不幸的是$test = gettrue($undefinedA, 'yes', $undefinedB); 会抛出两个通知【参考方案5】:

这是可以做到的!与 javascript 不完全一样,因为语言的工作方式不同。

这就是你可以做到的方式,有点像你在 javascript 中的方式:

($separator = $options['title-separator'])
    || ($separator = ' | ');

这里的区别是你在赋值后检查变量。因为 PHP 在 || 之后不会继续执行任何操作如果第一部分的计算结果为 TRUE,则您最终只执行第一个作业。

在我看来,这是一种非常简洁易读的链接回退方式。如果需要,您可以链接更多的后备分配,这对于普通的 if 语句和简写“?:”

【讨论】:

我很确定您在发布答案之前阅读了answer posted by @KingCrunch...或者是吗?!【参考方案6】:

PHP 7 引入了 Null Coalescing 运算符,您可以在其中使用 like

$first_name = $_POST['f_name'] ?? 'no data found';

【讨论】:

【参考方案7】:
$separation = $var1 . ($var2 ? ($var1 ? ' | ' : '') . $var2 : $var2);

【讨论】:

以上是关于如果一个为空白,如何将变量分配给两个字符串之一?的主要内容,如果未能解决你的问题,请参考以下文章

将`input`的值分配给变量但在JS中返回空白

Codeigniter将数据库值分配给变量

将结构的第一个变量分配给另一个

怎么给参数赋两个值

如何将字符串列分配给变量并在 Bash 脚本的输出中引用它

Java - 将数组值分配给单个变量的快速方法