如何在不抛出通知的情况下在空数组索引处预递增


How can I pre-increment at an empty array index without throwing a notice?

我想这样做:

$matched_tags[$tag]++

作为跟踪在循环期间找到给定$tag的次数的简单方法。

这似乎是在第一次遇到任何新$tag时抛出 NOTICE,因为索引未定义。PHP 友好地自动激活它,将其设置为 0 并递增它,但无论如何都会抛出 NOTICE。

现在,我喜欢将通知作为最佳实践进行开发,所以我不想抑制它们。但对我来说,我正在做的事情并不值得注意。

我真的必须:

if ( ! isset ( $matched_tags[$tag] ) ) $matched_tags[$tag] = 0;
$matched_tags[$tag]++;

哦,这太痛苦了。请告诉我有一种更优雅的方式,或者我发誓我会切换到 Perl,所以请帮助我。

我找到了另一种递增未定义数组项的方法。它看起来像是一种黑客,但它很明显并且仍然很短。

假设您需要递增几个嵌套数组的叶值。使用isset()可能太烦人了:

<?php
error_reporting(E_ALL);
$array['root']['node'][10]['node'][20]['leaf'][30]['totalCount'] = 
    isset($array['root']['node'][10]['node'][20]['leaf'][30]['totalCount'])
    ? ($array['root']['node'][10]['node'][20]['leaf'][30]['totalCount'] + 1)
    : 1;

一个数组项目的名称在那里重复了三次,在你的眼睛里荡漾。

尝试使用运算符&获取数组项引用。使用不引起任何通知或错误的参考进行操作:

<?php
error_reporting(E_ALL);
$item = &$array['root']['node'][10]['node'][20]['leaf'][30]['totalCount'];
// $item is null here
$item++;
unset($item);
echo $array['root']['node'][10]['node'][20]['leaf'][30]['totalCount']; // 1

它工作得很好,但您也可以避免null 0铸造:

<?php
error_reporting(E_ALL);
$item = &$array['root']['node'][10]['node'][20]['leaf'][30]['totalCount'];
// $item is null here
$item = isset($item) ? ($item + 1) : 1;
unset($item);
echo $array['root']['node'][10]['node'][20]['leaf'][30]['totalCount']; // 1

如果您已经在使用 PHP7,请使用合并运算符而不是isset()

$item = ($item ?? 0) + 1;

现在使用 @ 禁止显示错误:

@$matched_tags[$tag]++;

三元运算符的痛苦程度会降低吗?

array_key_exists( $tag, $matched_tags ) ? $matched_tags[$tag]++ : $matched_tags[$tag] = 1;