如何避免“未定义的索引”错误?

2022-08-30 12:17:20

我正在研究以前的开发人员完成的一些代码。我对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 */

我知道我可以在这里用于每个项目。我必须重新安排一下,并像现在这样删除所有串联。有没有其他简单的方法来做到这一点,或者我只是坚持下去?isset()


答案 1

找出$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] = '';
}

答案 2

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

//snip
$str = 'something'
 . ( isset($output['alternate_title']) ? $output['alternate_title'] : '' )
 . ( isset($output['access_info']) ? $output['access_info'] : '' )
 . //etc.

如果设置了字符串,您还可以编写一个函数来返回该字符串 - 这可能不是很有效:

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

$str = getIfSet($output['alternate_title']) . getIfSet($output['access_info']) //etc

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