在PHP三元运算符和空合并运算符中忽略'else'关键字

4

我在阅读关于PHP中三元运算符和空值合并运算符的相关内容,并进行了一些实验。

因此,你可以使用三元运算符和空值合并运算符的方式来代替这种写法:

if (isset($array['array_key']))
{
    $another_array[0]['another_array_key'] = $array['array_key'];
}
else
{
    // Do some code here...
}

我尝试使用 null coalescing 进一步缩短代码,而不是使用 null coalescing 或三目运算符来缩短它,但没有包含 'else' 部分,因为我并不需要。我搜索了一些解决方案,但都不是我想要的。

我尝试了这个方法,两种解决方案都可行!

$another_array[0]['another_array_key'] = $array['array_key'] ??
$another_array[0]['another_array_key'] = $array['array_key'] ? :

print_r($another_array);

注意上面那行代码末尾没有分号。 我的问题是:这段代码是否可接受?我认为用注释解释它可能会影响代码的可读性。 如果这是一个类似的问题,抱歉 - 我没有时间检查所有问题,因为Stack Overflow提供了相当多的建议。 以下是完整的代码示例:“
<?php

$another_array = [];

$array = [
    'name' => 'Ivan The Terrible',
    'mobile' => '1234567890',
    'email' => 'tester@test.com'
];

if (isset($array['name']))
{
    $another_array[0]['full_name'] = $array['name'];
}


$another_array[0]['occupation'] = $array['occupation'] ??
// or $another_array[0]['occupation'] = $array['occupation'] ? :

print_r($another_array);

你已经回答了自己的问题。如果你想让代码易于维护,那么编写源代码时要以别人为读者,而不是只考虑自己。 - Reactgular
2
关于“注意上面一行末尾没有分号。”:这可能使其在几乎所有情况下都无效,并在其他所有情况下产生意外结果。这意味着您需要放置某些内容,从而使其更易读。 - Yoshi
请注意,?:?? 不等同。如果数组中不存在该键,则第一个将导致 PHP Notice - Yoshi
5
“两个解决方案都起作用了”——您的想法是错误的,因为这个整体被认为是一个表达式,不需要分号就能够正常使用。(这里的换行对语法没有意义,在某些其他语言中,它们会把这个整体分成多个独立的表达式。) - 04FS
2
谢谢@Cid。我已经在那里添加了例子。 - IvanTheTerrible
显示剩余4条评论
1个回答

2

易读性,可维护性... 如果你想测试许多可能的数组键,然后将它们添加或不添加到最终数组中,那么你可以创建第三个数组来保存要检查的键,并循环遍历它:

<?php

$another_array = [];

$array = [
    'name' => 'Ivan The Terrible',
    'mobile' => '1234567890',
    'email' => 'tester@test.com'
];

$keysToCheck = [
    // key_in_the_source_array => key_in_the_target
    'name' => 'full_name',
    'occupation' => 'occupation'
    // if you want to test more keys, just add them there
];

foreach ($keysToCheck as $source => $target)
{
    if (isset($array[$source]))
    {
         $another_array[0][$target] = $array[$source];
    }
}

print_r($another_array);

请注意:
$another_array[0]['occupation'] = $array['occupation'] ??

print_r($another_array);

被评估为

$another_array[0]['occupation'] = $array['occupation'] ?? print_r($another_array);

如果在之后再添加一个print_r($another_array);,你会注意到$another_array[0]['occupation'] => true,这是因为print_r()的返回值造成的影响。(参考文档)


1
准确的@Cid。我刚刚在这里添加了一条评论:https://dev59.com/47joa4cB1Zd3GeqPDLMf#5FcpoYgBc1ULPQZFhBU5 - IvanTheTerrible
@IvanTheTerrible 是的,我刚看到了 - Cid

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接