我正在编写一些代码来构建计数器的关联数组。当它第一次遇到新项目时,它会创建一个新键并将其初始化为零。即:
if (!array_key_exists($item, $counters)) {
$counters[$item] = 0;
}
$counters[$item]++;
但是,PHP 实际上隐含地执行了第一部分。如果我只是...
$counters[$item]++;
... 然后 $counters[$item] 将评估为 NULL 并在递增之前转换为 0。显然第二种方式更简单、更简洁,但感觉有点低俗,因为 $counters[$item] 可能还不存在并不明显。在 PHP 中是首选一种方式还是另一种方式?
为了进行比较,在 Python 中,惯用的方法是使用 collections.Counter 当你想要将自己初始化为 0 的键时,以及当你想要自己初始化它们时使用常规字典。在 PHP 中,您只有第一个选项。
最佳答案
递增未初始化的键会生成一个 PHP 通知,这是一个坏主意。您应该始终先初始化。
但是,array_key_exists
的使用不是很地道。我知道来自 Python 它可能看起来很自然,但是如果你知道 $counter
没有有意义的 NULL
值,那么使用 isset()
测试数组成员。 (它也无缘无故地快得多!)
这就是我用 PHP 编写计数器的方式:
$counters = array();
foreach ($thingtobecounted as $item) {
if (isset($counters[$item])) {
$counters[$item]++;
} else {
$counters[$item] = 1;
}
}
不幸的是,与 Python 不同,PHP 不提供任何不执行两次键查找的方法。
关于PHP:使用计数器的关联数组,在第一次递增之前将每个值显式初始化为 0 是否更符合习惯?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15843231/