假设您需要创建某种类型的"top",并具有如下代码:
$matches=array();
foreach ($array as $v){
$matches[processing($v)]++;
}
对于需要创建索引的情况,这将输出**Notice: Undefined index
**。
既然您知道必须创建索引,那么处理这些情况的最佳方法是什么?
我根据具体情况使用了以下解决方案:
1.抑制错误@$matches[$v]++;
- 亲**:非常容易打字
- 缺点**:缓慢
1.检查是否设置为$matches[$v]=isset($matches[$v])?$matches[$v]++:1;
- 专业**:更快
- 缺点**:即使以速记形式书写也需要更长时间,需要再使用$matches [$v] 2次
还有别的办法吗?
寻找最快的执行时间,因为我使用这个函数数千次,或者寻找更懒的方式键入,但仍然比@快
- 编辑:**
在一个简单的例子中,您有$matches[$v]++;
,您也可以使用array_count_values()
(如Yoshi建议的)
4条答案
按热度按时间rqqzpn5f1#
经过一些阅读,写作和测试我得到了一些东西:
以为我找到了金子但先看看测试结果。
测试代码:
执行时间:* (仅供参考)*
结论:
@
当然是输入速度最快的,我看不出使用它有什么问题在这种情况下,但也可以随时检查这个问题:Suppress error with @ operator in PHPini_set()
完全抑制错误(在循环之前和在循环之后使能错误)在性能上比所有的都差inc()
看起来很好很干净,易于输入,并且执行检查而不是抑制,但是调用它看起来比@
还要慢isset()
比empty()
稍快,但两者的性能基本相同if
语句会稍微慢一些!array_fill()
比for
花费的时间略长!RFC
我不认为这个答案是100%完整的,尽管现在看起来
isset()
是最快的,@
是最懒的。任何意见和想法都是赞赏!
nr9pn0ug2#
您也许可以初始化matches数组,使用
array_combine
将$array
中的值组合为键,使用array_fill
将值填充为初始值0sr4lhrrt3#
我总是这样做:
你说得对。这是有点罗嗦,但公平地说,它是相当简洁的同时。我用
empty()
而不是isset()
虽然。不知道这是快或慢了我的头顶部。我认为它可能是慢。为了回答你的编辑,我会这样做:
这样,您只需调用该函数一次。
6za6bjd04#
PHP 7+解决方案: