解构数组时避免PHP注意

Man*_*uel 7 php arrays

假设我们有以下数组:

$ourArray = [
   'a' => 'a',
   'b' => 'b',
];
Run Code Online (Sandbox Code Playgroud)

我们尝试获取密钥的值'c'(不存在):

$someValue = $ourArray['c'] ?? null;
Run Code Online (Sandbox Code Playgroud)

因此,之前的声明不会引起任何注意,因为它只是语法糖isset.有关更多信息,请访问PHP站点.

在PHP7.1中引入了对称数组解构,因此想法是对数组进行解构以避免通知,例如:

[
    'c' => $someValue
] = $ourArray;
Run Code Online (Sandbox Code Playgroud)

所以这将抛出Undefined index: c in $ourArray ....

那么,有没有办法避免PHP使用对称数组解构引发通知?并且不使用像error_reporting或的功能ini_set.

小智 13

您可以尝试通过合并一些默认值来确保密钥存在于数组中:

[$val0, $val1, $val2] = $arr + [2 => null];
Run Code Online (Sandbox Code Playgroud)


Mic*_*has 9

用@解决方案

您可以使用该@运算符.
https://secure.php.net/manual/en/language.operators.errorcontrol.php

@[
    'c' => $someValue
] = $ourArray;
Run Code Online (Sandbox Code Playgroud)

免责声明
此运营商存在争议.它可能会隐藏函数调用中的有用错误消息.许多程序员即使花费很高也会避免使用它.对于作业,它是安全的.

默认解决方案

根据h2ooooooo的评论.

如果您可以并且想要定义所有默认值,您可以使用下面的代码.

[
    'c' => $someValue
] = $ourArray + $defaults;
Run Code Online (Sandbox Code Playgroud)

操作员+很重要.该功能array_merge不会保留数字键.

定义$defaults可能如下所示.您必须为每个可能的键定义值.

$defaults = [
    'a' => null,
    'b' => null,
    'c' => null,
    'd' => null,
    'e' => null,
    'f' => null,
];

# or

$defaults = array_fill_keys(
    ['a', 'b', 'c', 'd', 'e', 'f'],
    null
);
Run Code Online (Sandbox Code Playgroud)

  • 许多开发人员不鼓励“stfu 操作员”。是的,它有效,但它通常表示一个hacky解决方案,应该用更合适的东西代替(我没有投票)。 (4认同)
  • 您可以通过执行类似 [`$defaults = array_fill_keys(['a', 'b', 'c', 'd', 'e', 'f'], null);`]( https://eval.in/957671) (2认同)