Php 使用foreach和splfixedaray

Php 使用foreach和splfixedaray,php,spl,Php,Spl,似乎我无法在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 re

似乎我无法在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'

有什么解决方法吗?

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

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

有解决办法吗

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

如果希望在
foreach
循环中重新分配值,可以像使用普通数组一样使用该键。不过,我不认为这是一种变通方法,因为这是一种正确的、预期的方法


原文:不好 按键分配:好 有解决办法吗

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

如果希望在
foreach
循环中重新分配值,可以像使用普通数组一样使用该键。不过,我不认为这是一种变通方法,因为这是一种正确的、预期的方法


原文:不好 按键分配:好
它并不总是更快;但最大的好处是显著降低内存使用率(特别是在处理大量数据时),而不是性能。。。事实上,当使用foreach进行迭代时,它们的速度要慢得多,但是当直接使用keyKey进行访问时,它们的速度要快得多。这很有趣,感谢您的洞察力。然而,我认为常规数组可能是他通过引用传递的唯一选择。更有可能的是,让它们更快的原因之一是它们的特性更少。关键问题是他为什么需要通过引用传递。。。我已经对使用密钥批量填充原始问题发表了评论,但不知道OP真正想要什么,很难判断这是真的。另外,作为提示,您关于使用
foreach
的建议实际上与我在本回答中的建议相同。(因为PHP会在这个过程中创建一个常规数组)@NickJ欢迎使用StackOverflow它并不总是更快;但最大的好处是显著降低内存使用率(特别是在处理大量数据时),而不是性能。。。事实上,当使用foreach进行迭代时,它们的速度要慢得多,但是当直接使用keyKey进行访问时,它们的速度要快得多。这很有趣,感谢您的洞察力。然而,我认为常规数组可能是他通过引用传递的唯一选择。更有可能的是,让它们更快的原因之一是它们的特性更少。关键问题是他为什么需要通过引用传递。。。我已经对使用密钥批量填充原始问题发表了评论,但不知道OP真正想要什么,很难判断这是真的。另外,作为提示,您关于使用
foreach
的建议实际上与我在本回答中的建议相同。(因为PHP会在这个过程中创建一个常规数组)@NickJ欢迎使用StackOverflow使用foreach循环预填充的方法是使用键:
foreach($spl as$key=>$value){$spl[$key]=“string”;}
SplFixedArray在任何部分都不使用引用;它不限于迭代。使用foreach循环预填充的方法是使用键:
foreach($spl as$key=>$value){$spl[$key]=“string”;}
SplFixedArray不适用于任何部分的引用;这并不局限于迭代,这是正确的。没有办法使用SplFixedArray通过引用进行迭代,因此正确的答案是不要这样做……这是正确的。使用SplFixedArray无法通过引用进行迭代,因此正确的答案是不要这样做。。。
$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);