【问题标题】:Using foreach with SplFixedArray将 foreach 与 SplFixedArray 一起使用
【发布时间】:2014-05-21 11:49:54
【问题描述】:

似乎我无法通过引用对 SplFixedArray 中的值进行迭代:

$spl = new SplFixedArray(10);
foreach ($spl as &$value)
{
    $value = "string";
}
var_dump($spl);

输出:

Fatal error: Uncaught exception 'RuntimeException' with message 'An iterator cannot be used with foreach by reference'

有什么解决方法吗?

【问题讨论】:

  • 使用 foreach 循环预填充的方法是使用密钥:foreach ($spl as $key => $value) { $spl[$key] = "string"; }
  • SplFixedArray 不适用于任何部分的引用;它不仅限于迭代。

标签: php spl


【解决方案1】:

有什么解决方法吗?

简短回答:不要通过引用进行迭代。这是几乎所有 PHP 的迭代器都会抛出的异常(此异常的异常非常很少); SplFixedArray 没什么特别的。

如果您希望在foreach 循环中重新分配值,您可以像使用普通数组一样使用键。不过,我不会将其称为解决方法,因为它是正确且预期的方法。


原文:不好

$spl = new SplFixedArray(10);
foreach ($spl as &$value)
{
    $value = "string";
}
var_dump($spl);

按键赋值:好

$spl = new SplFixedArray(10);
foreach ($spl as $key => $value)
{
    $spl[$key] = "string";
}
var_dump($spl);

【讨论】:

  • 这是正确的。用SplFixedArray是没有办法通过引用来迭代的,所以正确的答案是不做……
【解决方案2】:

根据文档, splfixedarray() 的唯一优点是它比普通数组快。但我不记得有人提到数组很慢。因此,您最好的解决方案可能是切换到常规数组。

【讨论】:

  • 并不总是更快;但最大的好处是显着降低了内存使用量(尤其是在处理大量数据时)而不是性能......事实上,当使用 foreach 进行迭代时,它们的速度明显变慢,但在直接通过键访问时速度略快
  • 这很有趣,感谢您的洞察力。但是,我认为常规数组可能是他通过 ref 传递的唯一选择。很有可能,让它们变得更快的原因之一是它们的功能更少。
  • 关键问题是 为什么 他需要通过引用传递...我已经评论过使用密钥批量填充原始问题,但不知道真正的 OP希望很难提供建议
  • 这是真的。同样作为提示,您关于使用 foreach 的建议实际上与我在此答案中的建议相同。 (因为 PHP 会在这个过程中创建一个常规数组)
  • @NickJ 欢迎来到 StackOverflow
猜你喜欢
  • 1970-01-01
  • 2017-04-15
  • 2016-04-02
  • 2011-06-03
  • 1970-01-01
  • 1970-01-01
  • 2013-08-09
  • 2014-03-06
相关资源
最近更新 更多