拿这个:
$data = array('one'=>'1','three'=>'3');
现在哪个更好? 这样:
echo @$data['two'];
或者这个:
function val($data,$key,$default){
if(isset($data[$key])){
return $data[$key];
}
return $default;
}
echo val($data,'two','');
或者这个:
echo isset($data['two'])?$data['two']:'';
还是其他什么?
避免通知:注意:未定义的索引:文档中的两个#num
哪一个效率最高,我应该使用哪一个? 我想知道可能超缓慢的错误抑制可能比拥有专用函数更快?
P.S。很多答案似乎都假设我这样做是一种优化形式,这不是真的,我在好奇心和“我应该使用哪一部分”中要求“效率”部分,因为我需要使用一些东西而我我想知道我应该默认的内容。
p.p.s。效率最高,使用最有可能是不同的
答案 0 :(得分:4)
使用您最喜欢的。应用程序的缓慢不是来自这个地方。
答案 1 :(得分:1)
来自java,我建议你使用第三个选项。这样,您就不会隐藏不起作用的代码,而是在没有代码时提供默认值。
第一种方法只是隐藏错误,第二种方式太长了。
答案 2 :(得分:1)
知道@
的错误抑制非常慢。我已经读过,转发错误报告,执行某些操作然后转换旧报告级别仍然比仅使用@
更快。
关于其他两个选项 - 它们对我来说是相同的,但只是输出,我会使用isset的第3个变体 - 只是看起来更好,不需要定义额外的功能......如果你使用了大量的输出 - 那么也许函数会减少代码重复,并且会更有用......
答案 3 :(得分:1)
这是常识性答案
“@”符号将禁止PHP生成的错误消息。抑制,通知将发生,并将调用错误处理函数。
isset
是语言构造的一部分,因此速度更快。
使用三元运算符isset($dat['index']) ? $data['index'] : null
,因为它看起来很干净并且不会触发错误处理
答案 4 :(得分:1)
Php有这个array_key_exists函数,我认为这是处理你正在做的事情最正确的方法。至于速度,这是我刚刚制作的测试程序:
//testing @
$t = microtime(TRUE);
$a = array('one' => 1, 'three' => 3);
for ($i = 0; $i < 1000000; $i++)
$b = @$a['two'];
echo (microtime(TRUE) - $t)."\n";
//testing array_key_exists
$t = microtime(TRUE);
$a = array('one' => 1, 'three' => 3);
for ($i = 0; $i < 1000000; $i++)
$b = array_key_exists('two', $a) ? $a['two'] : '';
echo (microtime(TRUE) - $t)."\n";
//testing isset
$t = microtime(TRUE);
$a = array('one' => 1, 'three' => 3);
for ($i = 0; $i < 1000000; $i++)
$b = isset($a['two']) ? $a['two'] : '';
echo (microtime(TRUE) - $t)."\n";
结果是:
5.9005348682404
9.6285729408264
0.32760310173035
所以是的,isset显然更快。
答案 5 :(得分:0)
@ error surpressing实际上就像这样
这就是不推荐的原因
有时候我会用它:
function issetor(&$variable, $or = NULL) {
return $variable === NULL ? $or : $variable;
}
因为写的时间更短:
echo issetor($data['two'],'');
比:
echo isset($data['two'])?$data['two']:'';
警告:如果issetor($arr[$k],null);
尚未设置,$arr[$k] = null;
将设置$arr[$k]
其他时候我使用自定义数组处理函数,具体取决于具体情况。