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

Undefined Index - isset guard doesn't work with helper

提问人:senty 提问时间:4/20/2018 最后编辑:senty 更新时间:4/20/2018 访问量:305

问:

我有一个来自发布请求的多维数组。它看起来像这样: .有时,此值不存在,因此会返回未定义索引错误。$request['bags'][1]['fruits']

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

如果我在控制器中使用 isset 保护,它可以工作

$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()

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

isset($request['bags'][1]['fruits']) ? $request['bags'][1]['fruits'] : ''; // works
php laravel 控制器 助手 undefined-index

评论

0赞 apokryfos 4/20/2018
如果你使用这个对象,你可以这样做,它负责为你检查存在,如果它不存在,则返回默认值(这里)。我认为在 5.4 之前的 laravel 版本中,这是但不确定的。此外,laravel也适用于数组上的点符号Request$request->input('bags.1.fruits', '')''$request->getarray_get

答:

3赞 Philipp Maurer 4/20/2018 #1

您遇到的问题是,一旦请求未定义的索引,就会引发未定义的索引通知。只要您想在使用 调用帮助程序函数时访问键后面的值,就会发生这种情况。提取该值,然后将其发送到函数。nullable($request['bags'][1]['fruits'])

相反,您可以做的是在 PHP 中使用 null 合并运算符??

$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');

代码示例

评论

0赞 Death-is-the-real-truth 4/20/2018
@NigelRen同意你的看法
0赞 Philipp Maurer 4/20/2018
@NigelRen感谢您的提示:-)当前的 laravel 要求是 7.1.3 作为附加信息。
0赞 senty 4/20/2018
@NigelRen 什么意思?它在 php 7.2 上对我有用
2赞 Nigel Ren 4/20/2018
令人惊讶的是,有多少人在运行 php 5.x 代码,我只是想确保有人没有尝试过并发现它不受支持。
0赞 Gammer 4/20/2018 #2

你能用吗condition? true : false :

方法:

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

或:

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

评论

0赞 Philipp Maurer 4/20/2018
运营商仍会抛出通知?: