如何解决数组中不存在的索引


How to resolve non-existant index in array?

我有自己的模板类。在这个类中,我将像{NEXT_PAGE}这样的字符串替换为

<?php echo $tpl->vars["NEXT_PAGE"]; ?>

但是有时候,这个索引并不存在。

我发现主题PHP: is_array上$arr['key']与不存在的'key',我知道如何检查是否存在一些索引。

我的问题是,怎样才能更好地提高性能。

  1. 总是检查索引是否存在,如果是,打印它
  2. 直接打印,不检查索引是否存在

第一个解决方案很好,没有警告,没有错误,没有注意,但是我遍历了数组两次,第一次检查它,第二次打印它。需要更多的CPU时间

第二个解决方案只是试着找到它,如果它存在打印它,否则打印空字符串,这对我来说是可以的,警告我可以禁用error_reporting


那么哪个更好呢?我认为第二个解决方案是禁用警告。PHP总是要检查index是否存在,但当我检查它时,它被检查了两次。我说的对吗?

需要说明的是,访问一个不存在的索引,最大占所有访问数组的3%。


我有一个表单,在那里我放回登录名,如果通过是不正确的。当我用<?php echo $tpl->vars["LOGIN_NAME"]; ?>替换{LOGIN_NAME}时,我将这个新文件保存为PHP脚本,所以后来我只是运行这个,不再替换!

编译后的脚本是这样的

<form ...>
<input type="login" ... value="<?php echo $tpl->vars["LOGIN_NAME"] ?>" />
(pass etc...)
</form>

所以当有人第一次访问这个页面时,LOGIN_NAME没有设置,PHP不能打印任何东西,但是没关系,字段仍然是空的。如果表单是发送的,脚本添加到LOGIN_NAME发送的登录名,然后字段不是空的。

您当前正在循环遍历文件中的模式匹配,然后用相应的模板变量替换匹配,如果它已设置。

你为什么不从另一个角度来看这个问题呢?

遍历模板变量并替换文件中的模式匹配项。然后,用空字符串替换所有剩余的模式匹配。

foreach ($tpl->vars as $key => $val) {
    $template = str_replace("{$key}", $val, $template);
}
$template = preg_replace('/{(.+?)}/', '', $template);

Update:由于您希望将php字符串写入模板而不是实际值,因此代码将看起来像这样:

foreach ($tpl->vars as $key => $val) {
    $template = str_replace("{$key}", "<?php echo '$tpl->vars['$key']; ?>", $template);
}
$template = preg_replace('/{(.+?)}/', '', $template);

那么$template将包含一个字符串,您写入缓存。原理是一样的

您的系统性能是否很关键?您每秒将执行多少次查找?

关于isset()如何比array_key_exists()快的帖子。http://ilia.ws/archives/247-Performance-Analysis-of-isset-vs-array_key_exists.html

考虑在数组中有或没有这个键在设计上意味着什么。它应该一直存在吗?模型在每种情况下都有效吗?

我目前的理解是需要查找

您可以将@放在echo语句前面,这样可以抑制任何错误。可能还有其他不需要以这种方式访问数组的方式编写模板引擎(可能使用自定义对象或extract()函数),但@技巧在这里似乎最简单。

您可以使用isset函数检查变量的索引是否存在:

if (isset($tpl->vars["NEXT_PAGE"]))
{
}