加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

php – 即使需要创建密钥,如何正确增加某些数组键?

发布时间:2020-12-13 17:43:51 所属栏目:PHP教程 来源:网络整理
导读:假设您需要创建某种类型的“顶部”并具有如下代码: $matches=array();foreach ($array as $v){ $matches[processing($v)]++; } 这将为索引需要创建的案例输出Notice:Undefined index. 既然你知道你必须创建索引,那么解决这些案例的最佳方法是什么? 我根据
假设您需要创建某种类型的“顶部”并具有如下代码:

$matches=array();
foreach ($array as $v){
   $matches[processing($v)]++;  
}

这将为索引需要创建的案例输出Notice:Undefined index.

既然你知道你必须创建索引,那么解决这些案例的最佳方法是什么?

我根据具体情况使用了这些解决方案

>抑制错误@ $匹配[$v];
亲:非常容易打字
骗局:慢
>检查是否设置$matches [$v] = isset($matches [$v])?$matches [$v]:1;
亲:更快
Con:即使是速记形式也需要更长的时间来写,需要多次使用$match [$v] 2次

还有其他方法吗?
寻找最快的执行时间,因为我使用此功能数千次或一些更懒的方式来输入仍然比@更快

编辑:

在一个简单的例子中你有$match [$v];你也可以使用array_count_values()(正如Yoshi建议的那样)

解决方法

经过一些阅读,写作和测试,我得到了一些东西:

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)

结论:

> @当然是输入速度最快的,在这种情况下我没有看到使用它的任何问题,但也可以随意检查这个问题:Suppress error with @ operator in PHP
>通过ini_set()完全抑制错误(在循环之前并在循环之后启用错误)比性能上的所有错误都要糟糕
> inc()看起来很干净,易于键入并检查而不是抑制,但调用它看起来比@更慢
> isset()稍微快于empty(),但两者的表现都相同
>有趣的是使用速记if语句稍微慢一些!
>预填充阵列时获得的最佳结果.即使长度未知,对于庞大的数据集,良好的预测仍会稍微快一点
>奇怪的是,array_fill()需要稍长于?!?!

RFC

我不认为这个答案100%完成,但是,现在它看起来像isset()是最快的和@最懒的.任何意见和想法表示赞赏!

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读