【发布时间】:2012-12-27 03:18:02
【问题描述】:
今天在开发用于博客的文本分析工具时,我发现 PHP 的行为对我来说非常奇怪,我无法理解它。在规范化文本时,我试图删除最小长度以下的单词,所以我在规范化方法中写了这个:
if ($this->minimumLength > 1) {
foreach ($string as &$word)
{
if (strlen($word) < $this->minimumLength) {
unset($word);
}
}
}
奇怪的是,这会在我的数组中留下一些低于允许长度的单词。在全班搜索错误后,我试了一下:
if ($this->minimumLength > 1) {
foreach ($string as $key => $word)
{
if (strlen($word) < $this->minimumLength) {
unset($string[$key]);
}
}
}
瞧!这非常有效。现在,为什么会发生这种情况?我查看了PHP Documentation 并指出:
如果通过引用传递的变量在函数内部是 unset(),则只有局部变量被销毁。调用环境中的变量将保持与调用 unset() 之前相同的值。
foreach 是否在这里充当calling environment,因为它有自己的范围?
【问题讨论】:
-
永远不要修改你正在迭代的东西,因为这种意外行为。
-
没有回答你关于引用的问题,但最简单、最干净的方法是使用 array_filter() 函数 - php.net/manual/en/function.array-filter.php
-
谢谢你,我之前使用过array_filter,但用于一些不同的目的。对于从数组中删除元素这样“简单”的操作,我不会想到它,但似乎将它们设置为
false并在其上运行 array_filter 确实是最清晰的方法