未定义的索引 - isset guard不适用于帮助程序

时间:2018-04-20 07:51:30

标签: php laravel controller helper undefined-index

我有一个来自post请求的多维数组。它看起来像这样:$request['bags'][1]['fruits']。有时,此值不存在,因此返回Undefined Index错误。

$model->fruits = $request['bags'][1]['fruits'];

如果我在控制器中使用isset guard,可以

$model->fruits = isset($request['bags'][1]['fruits'];) ? $request['bags'][1]['fruits'] : '';
$model->save();

现在,我想将它包装在一个函数中,这样我就可以使用nullable($fruits)之类的东西来完成这项工作。

现在,我尝试将其包装在辅助方法中;所以我创建了Helper.php并在里面添加了这个方法:

function nullable($value) {
    return (isset($value)) ? $value : '';
}

但是在我的控制器中,当我调用nullable()时,它会抛出Undefined Index错误。

nullable($request['bags'][1]['fruits']); // Undefined Index

isset($request['bags'][1]['fruits']) ? $request['bags'][1]['fruits'] : ''; // works

2 个答案:

答案 0 :(得分:3)

您遇到的问题是,一旦请求未定义的索引,就会抛出 Undefined Index Notice 。只要您在使用nullable($request['bags'][1]['fruits'])调用辅助函数时想要访问密钥后面的值,就会发生这种情况。值提取然后发送到函数。

您可以做的是使用PHP中的null coalesce operator ??

$model->fruits = $request['bags'][1]['fruits'] ?? '';

如果您真的想要创建自己的辅助函数,则需要以某种方式进行,因为当参数转移到函数时不会访问该字段。

这可以通过从您想要访问的密钥中扩展数组来实现。

function nullable(array $array, ...$keys) {
    $current = $array;
    foreach($keys as $key) {
        if (!isset($current[$key])) {
            return NULL;
        }
        $current = $current[$key];
    }
    return $current;
}

然后拨打nullable($request, 'bags', 1, 'fruits');

Code example

答案 1 :(得分:0)

您可以使用condition? true : false :

吗?

意思是:

$model->fruits = $request['bags'][1]['fruits'] ? $request['bags'][1]['fruits'] : '';

或者:

$model->fruits = $request['bags'][1]['fruits'] ?? '';