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

时间:2013-05-31 11:11:47

标签: php arrays indexing undefined

我有自己的模板类。在本课程中,我将字符串{NEXT_PAGE}替换为

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

但有时会发生,这个指数不存在。

我找到了主题PHP: is_array on $arr['key'] with non existing 'key',我知道如何检查某个索引是否存在。

我的问题是,提高绩效有什么好处。

  1. 始终检查索引是否存在,如果是,请将其打印
  2. 只需打印它而不检查索引是否存在。
  3. 第一个解决方案很棒,没有警告,没有错误,没有通知,但我经历了两次,第一次检查,第二次打印。需要更多的CPU时间。

    第二个解决方案只是尝试找到它,如果它存在则打印它,否则打​​印空字符串,对我来说没关系,我可以通过error_reporting

    禁用警告

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

    为了清楚起见,访问不存在的索引是访问此数组的最多3%。


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

    所以我的编译脚本是这样的

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

    因此,当有人第一次访问此页面时没有设置LOGIN_NAME,PHP无法打印任何内容,但是没关系,字段仍为空。如果表单已发送,则脚本添加到LOGIN_NAME发送登录名,然后字段不为空。

4 个答案:

答案 0 :(得分:2)

您正在循环浏览文件中的模式匹配,然后将匹配替换为相应的模板var(如果已设置)。

你为什么不从另一方面解决问题?

循环模板变量并替换文件中的模式匹配。然后,将剩余的模式匹配替换为空字符串。

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

更新:由于您要将php字符串写入模板而不是实际值,因此代码如下所示:

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

然后$template将包含您写入缓存的字符串。原则是一样的。

答案 1 :(得分:1)

您的系统性能是否至关重要?你每秒会执行多少次查找?

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

考虑一下设计在数组中是否拥有此键意味着什么。它应该永远存在吗?模型在每种情况下都有效吗?

我目前的理解是需要查找。

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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

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