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

时间:2013-10-23 23:43:37

标签: php notice autovivification

我想这样做:

$matched_tags[$tag]++

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

这似乎是在第一次遇到任何新的$ tag时抛出NOTICE,因为索引是未定义的。 PHP会自动对其进行自动生成,将其设置为0并将其递增,但无论如何都会抛出通知。

现在我喜欢将Notices作为最佳实践进行开发,所以我不想压制它们。但对我而言,我所做的并不值得注意。

我真的必须:

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

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

3 个答案:

答案 0 :(得分:2)

现在使用@解决错误:

@$matched_tags[$tag]++;

答案 1 :(得分:2)

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

假设您需要增加少量嵌套数组的叶值。使用(x_,y_) = (2.5, 3.6)可能太烦人了:

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

如果您已使用PHP7,请使用coalesce运算符而不是<?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

isset()

答案 2 :(得分:1)

三元运营商是否不那么痛苦?

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