【问题标题】:How to resolve non-existant index in array?如何解决数组中不存在的索引?
【发布时间】:2013-05-31 11:11:47
【问题描述】:

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

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

但有时会发生,该索引不存在。

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

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

  1. 始终检查索引是否存在,如果存在,打印它
  2. 只打印它而不检查索引是否存在。

第一个解决方案很棒,没有警告,没有错误,没有通知,但是我通过数组两次,第一次检查它,第二次打印它。需要更多 CPU 时间。

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


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

需要明确的是,访问不存在的索引最多占所有访问该数组的 3%。


示例 我有一个表格,如果通过不正确,我会在其中放回登录名。 当我将 {LOGIN_NAME} 替换为 &lt;?php echo $tpl-&gt;vars["LOGIN_NAME"]; ?&gt; 时,我将这个新文件像 PHP 脚本一样保存,所以稍后我只运行它,不再替换!

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

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

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

【问题讨论】:

  • &lt;?php echo (isset($tpl-&gt;vars["NEXT_PAGE"])) ? $tpl-&gt;vars["NEXT_PAGE"] : ''; ?&gt; 它不需要处理整个数组来执行此操作,因为它每次都是直接哈希查找
  • 我认为第一个解决方案,混淆的可能性较小。
  • @MarkBaker,对于数组,有“array_key_exists”函数而不是“isset”。
  • @maximkou - 我知道,isset() 更快,因为它是一种语言结构而不是函数
  • 很高兴指出array_key_exists()...它只是检查键是否存在,不像isset(),它也会在相应的数组值上运行isset(),如果找到的话。

标签: php arrays indexing undefined


【解决方案1】:

您当前正在循环通过文件中的模式匹配,然后将匹配替换为相应的模板 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 将包含您写入缓存的字符串。原理是一样的。

【讨论】:

  • 不,我替换文件中的所有匹配项,然后将其缓存为 PHP 脚本,稍后仅调用此 PHP 脚本。我会在一分钟内为我的问题添加示例。
【解决方案2】:

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

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

想想在设计方面在数组中有或没有这个键意味着什么。它应该一直在那里吗?模型在每种情况下都有效吗?

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

    • 我同意@MarkBaker,抑制错误从来都不是一个好的解决方案。
    • 在大多数情况下,我不会推荐这种方法,但在这里似乎它可能是性能最高的,没有任何真正的缺点。对于数组键存在的 97% 的时间,我认为这将是最快的,当然应该对其进行基准测试以确保。
    • 但现在我看到了@JoeGreen 的解决方案,我认为它更好,所以我会投赞成票。
    【解决方案4】:

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

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

    【讨论】:

    • 请再次阅读我的问题,我说过,我知道如何检查索引是否存在...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-03-13
    • 2021-11-02
    • 2014-07-11
    • 1970-01-01
    • 1970-01-01
    • 2020-12-18
    • 1970-01-01
    相关资源
    最近更新 更多