我想这样做:
$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;