PHP数组和"未定义索引"错误的解决方案

37 php arrays

我正在处理前一个开发人员完成的一些代码.我是PHP的新手,所以我想知道是否有任何众所周知的模式或解决方案来解决这个问题.

基本上,原作者在尝试使用它们之前不会检查任何数组索引.我知道我可以使用isset()在使用之前检查每个,但是现在有数百行出现这些错误.在我放入一些音乐并开始将我的头撞入键盘之前,我想确保没有一些很好的快捷方式来处理它.这是我正在看的典型代码部分:

    /* snip */
"text" => $link . $top_pick_marker . $output['author'] . " " .  " " . 
                              $output['new_icon'] . $output['rec_labels'] . "   " 
                    . $output['admin_link']
                    . $output['alternate_title'] 
                    . $output['access_info'] 
                    . $output['description'] 
                    . $output['url']
                    . $output['subject_terms'] 
                    . $output['form_subdivisions'] 
                    . $output['dates_of_coverage']  
                    . $output['update_frequency']  
                    . $output['place_terms'],
    /* snip */
Run Code Online (Sandbox Code Playgroud)

所以我知道我可以在这里为每个项目使用isset().我将不得不重新安排一些事情并删除现在的所有连接.有没有其他简单的方法可以做到这一点,还是我只是坚持下去?

小智 25

找出$ output数组中的键,并用空字符串填充缺少的键.

$keys = array_keys($output);
$desired_keys = array('author', 'new_icon', 'admin_link', 'etc.');

foreach($desired_keys as $desired_key){
   if(in_array($desired_key, $keys)) continue;  // already set
   $output[$desired_key] = '';
}
Run Code Online (Sandbox Code Playgroud)


Tom*_*igh 11

您可以使用isset()而不会丢失串联:

//snip
$str = 'something'
 . ( isset($output['alternate_title']) ? $output['alternate_title'] : '' )
 . ( isset($output['access_info']) ? $output['access_info'] : '' )
 . //etc.
Run Code Online (Sandbox Code Playgroud)

你也可以写一个函数来返回字符串,如果它被设置 - 这可能不是很有效:

function getIfSet(& $var) {
    if (isset($var)) {
        return $var;
    }
    return null;
}

$str = getIfSet($output['alternate_title']) . getIfSet($output['access_info']) //etc
Run Code Online (Sandbox Code Playgroud)

您不会收到通知,因为变量是通过引用传递的.


小智 7

SquareRootOf2答案的变体,但应该在第一次使用$ output变量之前放置:

$keys = array('key1', 'key2', 'etc');
$output = array_fill_keys($keys, '');
Run Code Online (Sandbox Code Playgroud)


Pas*_*TIN 6

如果您要维护旧代码,那么您可能无法瞄准"有史以来最好的代码"......在我看来,这可能会降低error_reporting级别.

这些" 未定义的索引 "应该只是通知; 因此,您可以设置error_reporting级别以排除通知.

一个解决方案是使用该error_reporting功能,如下所示:

// Report all errors except E_NOTICE
error_reporting(E_ALL ^ E_NOTICE);
Run Code Online (Sandbox Code Playgroud)

此解决方案的好处是您可以将其设置为仅在必要时排除通知(例如,如果只有一个或两个文件具有此类代码)

另一个解决方案是在php.ini中设置它(如果您正在处理多个应用程序,可能不是一个好主意,因为它可能会掩盖有用的通知); error_reporting在php.ini中看到.

但我坚持认为:这只是因为你维护一个旧的应用程序是可以接受的 - 在开发新代码时你不应该这样做!


归档时间:

查看次数:

87628 次

最近记录:

6 年,2 月 前