我有自己的模板类。在本类(class)中,我替换了类似 {NEXT_PAGE}
的字符串。至
<?php echo $tpl->vars["NEXT_PAGE"]; ?>
但有时会发生该索引不存在的情况。
我找到主题PHP: is_array on $arr['key'] with non existing 'key'我知道如何检查某些索引是否存在。
我的问题是,什么可以更好地提高性能。
- 始终检查索引是否存在,如果存在,则打印它
- 只打印它而不检查索引是否存在。
第一个解决方案很棒,没有警告,没有错误,没有通知,但我遍历数组两次,第一次检查它,第二次打印它。需要更多的 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 发送的登录名,然后字段不为空。
最佳答案
您当前正在循环遍历文件中的模式匹配,然后将匹配替换为相应的模板变量(如果已设置)。
为什么不从另一个角度来考虑问题呢?
循环遍历模板变量并替换文件中的模式匹配。然后,将所有剩余的模式匹配替换为空字符串。
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
将包含您写入缓存的字符串。原理是一样的。
关于php - 如何解决数组中不存在的索引?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16855933/