6

我想这样做:

$matched_tags[$tag]++

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

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

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

我真的必须:

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

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

4

3 回答 3

5

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

假设您需要增加几个嵌套数组的叶值。使用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 上,请使用 coalesce 运算符而不是isset()

$item = ($item ?? 0) + 1;
于 2017-04-01T16:07:25.073 回答
2

现在使用 @ 抑制错误:

@$matched_tags[$tag]++;
于 2013-10-24T00:06:59.867 回答
1

三元运算符的痛苦是否减轻了?

array_key_exists( $tag, $matched_tags ) ? $matched_tags[$tag]++ : $matched_tags[$tag] = 1;
于 2013-10-24T00:00:40.803 回答