从可能不存在且没有错误的数组值中分配 PHP 变量的最快方法

Posted

技术标签:

【中文标题】从可能不存在且没有错误的数组值中分配 PHP 变量的最快方法【英文标题】:Quickest way to assign a PHP variable from an array value that may not exist without error 【发布时间】:2015-12-30 00:31:47 【问题描述】:

这是一种代码高尔夫,但我不觉得它偏离主题,因为这个问题实际上在我工作时经常出现,并且保持代码简洁和可读是非常on的主题。

//$array = ['A' => 'FOO', 'B' => 'BAR'];
//We don't necessarily know what this is

// :-)
$variable = ( isset($array['A']) ) ? $array['A'] : NULL ); 
//We just want $variable to be NULL if the key isn't in the array

工作正常,但变量名称较长时会变得很长,并且难以读取大型多维数组...

[
    'Foo' => 'Bar',
    'Boo' => [
         'FooBarMacFooBar' => ( isset($SomeOtherLongVariable['BooBarMcFooFar']) ) ? $SomeOtherLongVariable['BooBarMcFooFar'] : NULL )
     ] ; 
]

除了丑陋和难以阅读之外,它不符合 PSR-2 的最大线宽 (80?)。

如果我这样做,飞机不会坠毁...

[
    'Foo' => 'Bar',
    'Boo' => [
         // THIS WILL THROW AND ERROR NOTICE IF THE KEY DOESN'T EXIST
         'FooBarMacFooBar' => $SomeOtherLongVariable['BooBarMcFooFar']
     ] ; 
]

...但是如果数组的内容未知,它将在日志中填满有关“数组键不存在”的错误通知。

有解决办法吗? (另外写一个辅助函数)

(...除了使用 Ruby :-)

【问题讨论】:

php 7.0(发布时)中有 ?? 运算符或“Null Coalesce Operator”。在 5.5 中,您可以将 ?: 作为类似的三元组,但仍会抛出“未定义索引”通知。除此之外,不是真的。 抑制通知(不是错误)有多糟糕?通知只是建议。考虑到它很容易检测到的所有不良做法,确实可能会在 php 中添加大量其他通知,但 php 之神似乎已经任意决定什么是足够糟糕的通知。 @Bsienn:这也会触发通知,因为未定义的元素被传递给该方法。除非参数是通过引用声明的,但随后调用具有创建元素的副作用。 【参考方案1】:

这多年来一直困扰着 PHP 开发人员,在 PHP 7 中,COALESCE 运算符 ?? 终于出现了:

新方式(从 PHP 7 开始):

$variable = $array['A'] ?? null

与您的代码完全相同。

引用RFC:

添加了coalesce 或?? 运算符,如果第一个操作数存在且不是NULL,则返回它的结果,否则返回第二个操作数。这意味着$_GET['mykey'] ?? "" 是完全安全的,不会引发E_NOTICE

旧方法(hackish 解决方法):

$variable = @$array['A'] ?: null;

这使用错误抑制运算符@ 来使通知静音,并使用短三元运算符?:。如果我们只需要将$variable设置为null,如果没有设置$array['A'],则可以缩短为

$variable = @$array['A'];

需要注意的是,@ 被认为是不好的做法,我实际上觉得推荐它有点脏,但如果你能忍受偶尔违反最佳做法的情况,这是没有害处的情况:

在这一行中只有一个可能发生的错误(未定义的变量/偏移量)。你期待它并优雅地处理它。

【讨论】:

天哪,我讨厌 @,但该死的,如果它有时没有帮助的话。 很好的答案! @ 在 PSR-2 中被“禁止”了吗?我对此并不教条,但我很好奇当我使用 CS 嗅探器等时它是否会让我头疼 @ 在 PSR-2 中没有被禁止,但有代码嗅探器会寻找它,所以这取决于您的设置:github.com/squizlabs/PHP_CodeSniffer/blob/master/CodeSniffer/…

以上是关于从可能不存在且没有错误的数组值中分配 PHP 变量的最快方法的主要内容,如果未能解决你的问题,请参考以下文章

Swift 没有从 JSON 结果中分配变量

是否需要从堆栈中分配 C 可变长度数组?

从 Swift 字典中分配 UITableView Cell 标签文本

javascript 使用解构分配从数组中分配变量

在没有numpy的python中分配一个变量NaN

从数组中分配一个键名