gpt4 book ai didi

php - 如何正确增加一些数组键,即使需要创建键?

转载 作者:可可西里 更新时间:2023-10-31 22:13:01 27 4
gpt4 key购买 nike

假设您需要创建某种“顶部”并具有如下代码:

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

这将输出一个 Notice: Undefined index 对于索引需要创建的情况。

既然您知道必须创建索引,那么处理这些情况的最佳方法是什么?

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

  1. 抑制错误 @$matches[$v]++;
    Pro:非常容易输入
    缺点:慢
  2. 检查是否已设置 $matches[$v]=isset($matches[$v])?$matches[$v]++:1;
    专业版:更快
    缺点:即使是速记形式也需要更长的时间来编写,并且需要多使用 $matches[$v] 2 次

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

编辑:

在一个简单的例子中,你有 $matches[$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()for 花费的时间略长 ?!?!

RFC

我不认为这个答案是 100% 完整的,尽管目前看起来 isset() 是最快的而 @ 是最懒惰的。
感谢任何意见和想法!

关于php - 如何正确增加一些数组键,即使需要创建键?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14260894/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com