是否可以避免未定义偏移量PHP数组的警告?

Is it possible to avoid the warning of undefined offset PHP array?

提问人:gitguddoge 提问时间:8/14/2018 最后编辑:gitguddoge 更新时间:8/14/2018 访问量:4716

问:

我知道未定义的偏移量会发出警告而不是错误,但我想知道有没有可能的方法可以避免弹出这种警告?我打算编写一个函数来测试未定义的偏移量,因为我认为编写多个相似的条件来测试偏移量可能需要做很多工作。if-else

function testOffset($item){
        if(isset($item)){
            return $item;
        }else{
            return "Nothing here!";
        }
    }
$array1[] = "Hello!";
echo testOffset($array1[1]);

在这种情况下,函数运行良好,但是当我将未设置的元素分配到函数中时,警告也会弹出。无论如何要解决它?


我特意将检查索引设置为 1,以证明该函数运行良好

php 数组 undefined-index

评论

3赞 Tiến Nguyễn Hoàng 8/14/2018
array_key_exists怎么样?(php.net/manual/en/function.array-key-exists.php)
0赞 Naruto 8/14/2018
数组索引从 0 开始

答:

-2赞 Afraz Ahmad 8/14/2018 #1

您可以通过 php array_values内置函数来处理此问题:

  1. $yourArray = array_values($yourArray);

这将重新排列您的数组索引 例如 你有一个这样的数组:

 $a[0] = '...'
 $a[4] = '...'
 $a[7] = '...'
 $a[8] = '...'
 $a[9] = '...'

使用array_values后

 $a[0] = '...'
 $a[1] = '...'
 $a[2] = '...'
 $a[3] = '...'
 $a[4] = '...'

评论

0赞 gitguddoge 8/14/2018
也就是说,停止脚本执行意味着如果这是在循环中,它将停止脚本,对吗?
0赞 gitguddoge 8/14/2018
警告实际上并没有停止脚本,因为我刚才测试过
0赞 Ray A 8/14/2018 #2

因为您使用的是不存在的偏移量 1,

您可以使用以下方法进行简单的代码修复:

function testOffset($item){
        if(isset($item)){
            return $item;
        }else{
            return "Nothing here!";
        }
    }
$array1[] = "Hello!";
echo testOffset($array1[0]);

评论

0赞 gitguddoge 8/14/2018
感谢您的回答,但我打算以这种方式尝试该功能
4赞 mleko 8/14/2018 #3

你可以试试这样的功能

function issetOr($arr, $key)
{
    if (isset($arr[$key])) {
        return $arr[$key];
    } else {
        return "Nothing here!";
    }
}
$array1[] = "Hello!";
echo issetOr($array1, 1);

或者,如果您不想检查密钥是否存在,请使用

function issetOr($arr, $key)
{
    if (\array_key_exists($key, $arr)) {
        return $arr[$key];
    } else {
        return "Nothing here!";
    }
}
$array1[] = "Hello!";
echo issetOr($array1, 1);

在线演示

评论

0赞 Rafael 8/14/2018
也比使用 @ 好得多。
0赞 gitguddoge 8/14/2018
我意识到这比使用 @ 要好,尽管这两种方式都达到了我早期寻找的相同结果。@ 表示禁止显示警告通知,但很难说在其他情况下只有未定义的偏移是唯一的错误。
0赞 Mohamed El Mrabet 8/14/2018
好@gitguddoge
0赞 Mohamed El Mrabet 8/14/2018
您可以使用此本机函数 php.net/manual/fr/function.array-key-exists.php 如果您想要其他解决方案,它会更好
1赞 Mohamed El Mrabet 8/14/2018 #4

对于 php 中的逃逸警告和通知,您可以简单地使用@

function testOffset($item){
    if(isset($item)){
        return $item;
    }else{
        return "Nothing here!";
    }
}
$array1[] = "Hello!";
echo @testOffset($array1[1]);

评论

0赞 gitguddoge 8/14/2018
谢谢!这正是我一直在寻找的答案。我知道它会发出警告通知,但我只想简单地忽略它!
5赞 Afraz Ahmad 8/14/2018
使用 @ 不是一个好的做法,因为它会抑制错误或警告,这对开发人员来说很难调试。
0赞 Mohamed El Mrabet 8/14/2018
不客气,@AfrazAhmad在这里由开发人员承担责任,这是一个为很多情况提供 PHP 的焦点
0赞 Mohamed El Mrabet 8/14/2018
还有其他解决方案,如array_key_exists或其他@gitguddoge如果您愿意,我们可以聊天,我会为您提供其他解决方案。
0赞 gitguddoge 8/14/2018
@MohamedElMrabet真的很感谢这个答案,但 mleko 的答案在这方面更好。无论如何,我仍然会为你的答案投赞成票!
4赞 Nigel Ren 8/14/2018 #5

如果你使用的是 PHP 7+,你可以使用 null 合并来使整个事情只是一个衬里......

echo $array1[1] ?? "Nothing here!";
3赞 Naruto 8/14/2018 #6

有多种方法可以处理此问题,但根据您尝试执行的操作,您可以执行以下操作:

foreach($array as $key => $val) {}

如果您只是想根据键获取 1 个元素,您应该只使用array_key_exists

$array1[] = "Hello!";
echo (array_key_exists(1, $array1)) ? $array[1] : "No key";

评论

0赞 gitguddoge 8/14/2018
我想我没有很好地考虑这一点,因为我在同一个项目中通过检查数组中是否存在基于字符串的键来使用它......谢谢你!
0赞 Naruto 8/14/2018
如果它们是基于字符串的键,则只需在键周围添加“ ”