如果一个为空白,如何将变量分配给两个字符串之一?
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);
【讨论】:
以上是关于如果一个为空白,如何将变量分配给两个字符串之一?的主要内容,如果未能解决你的问题,请参考以下文章