如何停止PHP通知:未定义的索引| array_map |返回

问题描述

由于我正在使用一些语言功能,因此我总是在错误日志中收到PHP通知。不知何故我做对了...

我的语言数组如下(已编辑):

    $dict = [
        'title' => [
            'en' => 'Welcome','de' => 'Willkommen'
        ],'description' => [
            'en' => 'Hello','de' => 'Hallo'
        ],];

这是我的语言功能(已编辑):

function lang($phrase){
    global $l,$dict;

    return $dict[$phrase][$l];
}

$ l在$ dict数组之前定义(作为“ de”或“ en”)。

我在文档中正在执行

<?PHP echo lang('title');?>

PHP通知引用“返回$ dict [$ phrase] [$ l];”部分。 我真的不明白为什么。我尝试了不同的方法,但没有任何效果

编辑:

哦,该死。发布后,我终于意识到我在哪里使用了不在我的语言数组中的短语。不知何故我是瞎子。不过,该职位很好地清理了我的职能。谢谢!

解决方法

正如我在原始帖子中的评论所述,在数组声明中修复了丢失的括号(假定为拼写错误)后,函数works correctly(如果正确调用为echo lang('title'))。如果您在Undefined index上收到通知,则意味着您要查找的$phrase$dict数组中不存在。 (如果您仅在错误日志中得到通知,则在开发实时捕获错误时可能要打开屏幕错误报告!)

除了基本的调试之外,让我帮助您整理一下这段代码。首先,可以将$l或语言作为函数参数传递。其次,假设您没有即时修改$dict,则不必是变量。您可以将其声明为常量,并避免使用全局变量。第三,当您可以简单地调用数组中的相关索引时,数组映射是不必要的开销。然后进行最小程度的清理是这样的:

const DICT = [
    'title' => [
        'en' => 'Welcome','de' => 'Willkommen'
    ],'description' => [
        'en' => 'Hello','de' => 'Hallo'
    ]
];

function lang($phrase,$lang) {
    // If you're using PHP 7,the null-coalescing operator is handy here:
    return DICT[$phrase][$lang] ?? "Phrase {$phrase} Unknown!";
}

您将像这样使用它:

// Sample usage: Output title in English and description in German:

echo lang('title','en') . ' ' . lang('description','de');

// Or,if the language variable is pre-defined,then e.g.:

$l = 'en';
echo lang('title',$l) . ' ' . lang('description',$l);

在这里,为您的字典使用常量是一种基本的但非常有效的方式来处理全局对预定义数据的需求。常量在编译时解析,而变量声明在运行时解析。它们在所有情况下都可用。而且,您绝对不希望为了避免全局声明而将整个$dict包含在函数中!

一种更优雅的处理方式是创建一个类,这将使您避免使用language函数参数。 (类常量和属性类似于“局部全局变量”,可用于该类中的所有方法。)这是您作为类的案例的示例应用程序,其中字典是类常量,而语言是类属性:>

class Dict {

    const DICT = [
        'title' => [
            'en' => 'Welcome','de' => 'Willkommen'
        ],'description' => [
            'en' => 'Hello','de' => 'Hallo'
        ]
    ];
    
    public static $lang = 'en'; // for a default language
    
    public static function phrase($phrase)
    {
        return self::DICT[$phrase][self::$lang] ?? "Phrase {$phrase} Unknown!";
    }

}   

Dict::$lang = 'de'; // Define language

echo Dict::phrase('title') . ' ' . Dict::phrase('description');
// : Willkommen Hallo

如果您希望有一个需要在其他上下文中访问的大型词典,或者只是希望集中您的语言参考,那么您可能希望将其定义为类外部的常规常量,如第一个示例所示。我在这里使用的类常量主要用于教育目的。希望这可以帮助您前进并朝着更清洁的代码发展。

,

该通知表示您正在尝试访问不存在的数组索引。在您的情况下,您似乎混合了语言和短语的顺序:您尝试访问$ dict [en] [title]而不是$ dict [title] [en]。

更一般而言,在返回索引之前,请始终检查其是否存在:

if (isset($dict[$l])) {
    return ...
} else {
    throw new Exception... // or whatever
}

当您进一步使用PHP时,您会发现使用全局变量会带来更大的危害。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...