2013-10-23 14 views
2

我想做到这一点:如何在不投递通知的情况下在空数组索引处预增?

$matched_tags[$tag]++

由于跟踪给定的$标记多少次的循环过程中发现的一种简单方法。

这似乎是第一次遇到任何新的$标记时抛出一个NOTICE,因为索引是未定义的。 PHP友好地autovivifies它,将其设置为0并在后增加它,但抛出通知无论如何。

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

难道我真的要:

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

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

+0

那么,这是一个捕捉22位,你有你自己在那里。无论是前进还是禁止通知(它们不会停止脚本执行,它们就像PHP的说法:“嘿,现在......”),或者在使用它之前初始化数组元素,而PHP会让你一个人离开。 – Crackertastic

+1

要么使用'@'这是非常特别为此内置的语言(重要的:通知仍然生成,例如日志,只是没有默认显示),或创建一个增量包装函数inc(&$ var) {return ++ $ var; }'它隐式地创建本地var名称。 – mario

回答

1

我找到了另一种方式来增加不确定的数组项。它看起来像一种黑客,但它很明显,而且还很短。

假设您需要增加少数嵌套数组的叶值。使用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 

它工作得很好,但你也能避免null0铸造:

<?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; 
1

三元操作员是否不那么痛苦?

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

不是。哈哈。那么,至少它是一条线...... –

2

禁止使用@错误现在:

@$matched_tags[$tag]++; 
+0

嗯。虽然这肯定会诀窍,但它关系到我。我对此用法的理解是为了在操作系统功能期间抑制错误。我不确定我是否看到它用这种方式来解决语言的细微差别。 –

+0

@TomAuger我偶尔会这样做,但它并不完美,但它运行得很好 - 只要你理解其他代码的含义(在你的情况下,几乎不存在) – Fluffeh

+0

是啊,它不是以任何方式完美的解决方案,但至少它非常简单,以满足眼前的需求:) –

相关问题