如何停止PHP注意:未定义的索引|array_map|return



由于我使用了一个小的语言函数,我总是在错误日志中收到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通知指的是";return$dict[$phrase][$l]"部分我真的不明白为什么。我尝试了不同的方法,但都不起作用。

编辑:

哦,该死。发帖后,我终于意识到我在哪里使用了一个不再在我的语言数组中的短语。不知怎么的,我是盲人。尽管如此,这篇帖子还是很好地清理了我的职能。谢谢

正如我在原始帖子中的评论所指出的,在修复了数组声明中缺少的括号(假设拼写错误(后,如果函数被正确地调用为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

处理这一问题的一种更优雅的方法是创建一个类,这样可以避免使用语言函数参数。(类常量和属性类似于"局部全局",可用于类中的所有方法

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的进一步发展,您会发现使用全局变量会造成比实际价值更大的伤害。

最新更新