【问题标题】:foreach function on $GLOBALS generates a fatal error$GLOBALS 上的 foreach 函数会产生致命错误
【发布时间】:2016-10-27 13:03:35
【问题描述】:

此功能一次只作用于一个字段:

foreach ($GLOBALS as $key => $value) {
if ($key === "special1") {
{$value = preg_replace('/src/','data-machin', $value);          
}}}

这个 - 没有条件(因此它尝试处理 360 字段)不:

foreach ($GLOBALS as $key => $value) 
{$value = preg_replace('/src/','data-machin', $value);          
}

并生成此致命错误:无法在第 145 行的 /home/xxx/public_html/lib/mysqldb.php 中增加/减少重载对象或字符串偏移量。

我怎样才能让它工作?

(大图:我正在尝试实现一个脚本来延迟照片的加载)。

【问题讨论】:

  • 您已经有了解决自己问题的方法。 preg_replace() 不管你喜不喜欢,它的第三个参数都不用数组。
  • 感谢您的解释,所以现在我知道为什么它不起作用了,但我仍然需要一个解决方案。

标签: php mysql loops foreach


【解决方案1】:

preg_replace 仅对字符串值有意义。

因此,您可以在迭代时使用is_string 函数来检查值:

foreach ($GLOBALS as $key => $value) {
    if (is_string($value)) {
        $value = preg_replace('/src/','data-machin', $value); 
    }
}

另外请注意,这段代码不会产生副作用——即$GLOBALS 数组是没有修改的。您可以考虑改用references

foreach ($GLOBALS as $key => &$value) {
    ...
}
unset($value);

【讨论】:

  • 是的!这与 => &$value 一起工作。非常感谢!
  • 请注意,在 foreach 中使用引用会产生许多可能的不良副作用。
  • @JuliePelletier,是的,很好的提示,在循环之后添加了unset,这是一种常见的做法。
【解决方案2】:

虽然使用全局变量通常是一个坏主意,甚至更糟糕的是执行这种盲变量操作,但您可以这样做:

foreach ($GLOBALS as $key => $value) {
    if (is_string($value)) {
        $GLOBALS[$key] = preg_replace('/src/','data-machin', $value);
    }
}

更新为包含is_string(),它检查值是否为字符串。

【讨论】:

  • 是同样的错误,但它适用于亚历克斯提供的条件: if (is_string($value)) {...亚历克斯,你能向我解释一下,条件究竟是什么?我不是程序员,但我努力学习。
  • is_string() 将检查内容是否为字符串,以便与您的preg_replace() 调用兼容。
  • 好的,谢谢你们俩。所以这是我的最终工作解决方案:
  • foreach ($GLOBALS as $key => &$value) { if (is_string($value)) { $GLOBALS[$key] = preg_replace('/src/','data-machin ', $价值); } }
猜你喜欢
  • 1970-01-01
  • 2017-08-21
  • 1970-01-01
  • 2012-02-20
  • 1970-01-01
  • 2016-04-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多