2

カウンターの連想配列を構築するコードを書いています。初めて新しいアイテムに遭遇すると、新しいキーを作成し、それをゼロに初期化します。すなわち:

if (!array_key_exists($item, $counters)) {
    $counters[$item] = 0;
}
$counters[$item]++;

ただし、PHP は実際にはその最初の部分を暗黙のうちに実行します。私がそうするなら...

 $counters[$item]++;

... 次に、$counters[$item] は NULL と評価され、インクリメントされる前に 0 に変換されます。明らかに 2 番目の方法の方が単純で簡潔ですが、$counters[$item] がまだ存在しない可能性があることは明らかではないため、少し安っぽい感じがします。PHPではどちらの方法が優先されますか?

比較のために、Python での慣用的なアプローチは、自分自身を 0 に初期化するキーが必要な場合は collections.Counter を使用し、自分で初期化する場合は通常の辞書を使用することです。PHP では、最初のオプションしかありません。

4

4 に答える 4

3

最初のものが優先されます。2 番目のオプションは、ログに $counters[$item] が未定義であるという通知を生成します。それでも機能しますが、display_errors = On; を変更すると、error_reporting = E_ALL. php.ini ファイルで、ブラウザにこれらの通知が表示されます。

于 2013-04-05T20:49:08.987 に答える
2

最初の方法は、単純なメンテナンス以外の目的がなければ、一般的にどのように行うかです。あなたはコードを保守していない可能性があることを忘れないでください。正しく動作しているコードでエラー ログがいっぱいになるのは望ましくありません。さらに悪いことに、暗黙的な初期化が行われない他の言語 (または以前のバージョンの PHP) にメソッドを転送する必要がある場合があります。

于 2013-04-05T20:54:10.067 に答える
-1

各配列インデックスのチェックが本当に必要ない場合、またはほとんどのインデックスが定義されていないことがわかっている場合は、次のようなエラーを抑制しないでください。

(このようにして、[役に立たない] インデックスの初期化のパフォーマンスをいくらか節約できます)

if (@!array_key_exists($item, $counters)) {
于 2013-04-05T20:58:07.637 に答える