假设您需要创建某种类型的“顶部”并且具有以下代码:
$matches=array();
foreach ($array as $v){
$matches[processing($v)]++;
}
这将为索引需要创建的案例输出 Notice: Undefined index
。
由于您知道必须创建索引,因此处理这些案例的最佳方法是什么?
我根据具体情况使用了这些解决方案:
@$matches[$v]++;
$matches[$v]=isset($matches[$v])?$matches[$v]++:1;
还有其他方法吗?
寻找最快的执行时间,因为我使用此功能数千次或一些更为懒惰的输入方式仍然比@
修改
在您$matches[$v]++;
的简单情况下,您也可以使用array_count_values()
(正如Yoshi建议的那样)
答案 0 :(得分:6)
经过一些阅读,写作和测试后,我得到了一些东西:
function inc(&$var){
if (isset($var)) $var++;else $var=1;
}
并认为我敲了金,但让我们先看看测试......
$a=array();
// Pre-Fill array code goes here
for($i=1;$i<100000;$i++) {
$r=rand(1,30000);
//increment code goes here
}
// Remove extra keys from array with:
//foreach ($a as $k=>$v) if ($v==0) unset($a[$k]);
执行时间:(仅供参考)
inc($a[$r]) 1.15-1.24
@$a[$r]++ 1.03-1.09
$a[$r]=array_key_exists($r,$a)?$a[$r]++:1; 0.99-1.04
$a[$r]=!empty($a[$r])?$a[$r]++:1; 0.61-0.74
if (!empty($a[$r])) $a[$r]++;else $a[$r]=1; 0.59-0.67
$a[$r]=isset($a[$r])?$a[$r]++:1; 0.57-0.65
if (isset($a[$r])) $a[$r]++;else $a[$r]=1; 0.56-0.64
//with pre-fill
$a=array_fill(0,30000,0); +0.07(avg)
for($i=1;$i<=30000;$a[$i++]=0); -0.04(avg)
//with pre-fill and unset
$a=array_fill(0,45000,0); +0.16(avg)
for($i=1;$i<=45000;$a[$i++]=0); +0.02(avg)
@
当然是输入速度最快的,我在使用时没有看到任何问题但请随时查看此问题:{{3 }} ini_set()
完全抑制错误(循环之前并在循环之后启用错误)比性能更差inc()
看上去很干净,很容易打字并且检查而不是抑制,但调用它看起来比@
isset()
略快于empty()
,但两者的表现相当相同if
语句稍慢!array_fill()
需要的时间比for
稍长?!?!我不认为这个答案100%完成,但现在看起来isset()
是最快的,@
最懒。
任何意见和想法都表示赞赏!
答案 1 :(得分:1)
您可以初始化匹配数组,使用array_combine
将$array
的值组合为键,array_fill
将值填充为初始值0
$matches = array_combine(array_values($array), array_fill(0, count($array), 0));
答案 2 :(得分:0)
我总是这样做:
$matches=array();
foreach ($matches as $v){
/* if $v is not empty, add 1, otherwise $v= 1 */
$matches[$v]=(!(empty($matches[$v]))) ? $matches[$v]++ : 1;
}
你是对的。这有点罗嗦,但公平地说,它同时非常简洁。我使用empty()
代替isset()
。不确定我的头顶是否更快或更慢。我想它可能会慢一些。
修改强>
要回答你的编辑,我会这样做:
$matches=array();
foreach ($matches as $v){
$x=function($v);
/* if $v is not empty, add 1, otherwise $v= 1 */
$matches[$x]=(!(empty($matches[$x]))) ? $matches[$x]++ : 1;
}
这样,你只需要调用一次这个函数。