PHP:使用计数器的关联数组,在第一次递增之前将每个值显式初始化为 0 是否更符合习惯?

标签 php arrays counter

我正在编写一些代码来构建计数器的关联数组。当它第一次遇到新项目时,它会创建一个新键并将其初始化为零。即:

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/

相关文章:

python - 识别数组中的重复行并对另一个数组中的相应值求和

javascript - 如何通过使用数组从 Google 表格中提取数据并对其进行格式化来优化 Apps 脚本代码?

java - Tomcat 持久和用户特定的 session 计数器

java - 从帧率代码中得到奇怪的结果

java - 将 FrameLayout 设置为在按钮单击时可见

php - 判断返回码格式

php - 我可以用 PHP 检测 IE6 吗?

php - 如何使 PHP 类属性只能通过类方法更改

python - 编写一个访问参数维度 numpy 数组的方法

php - PDO、多语句和竞争条件