今日、ブログ用のテキスト分析ツールに取り組んでいるときに、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のドキュメントを確認したところ、次のように記載されています。
PASSED BY REFERENCEである変数が関数内でunset()されている場合、ローカル変数のみが破棄されます。呼び出し元の環境の変数は、unset()が呼び出される前と同じ値を保持します。
独自のスコープがあるため、foreach
ここで機能しますか?calling environment