问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

PHP in_array问题

发布网友 发布时间:2022-05-10 13:07

我来回答

2个回答

懂视网 时间:2022-05-10 17:28

问题

在一个接口中,发现非常耗时,排查原因发现 array_search 查找数组中的元素的 key 时,效率随着数组变大,耗时增加。特别是大数组时,非常耗时。在函数 in_array 也有这个问题。

解决办法

采用 array_flip 翻转后,用 isset 代替 in_array 函数,用 $array[key] 替代 array_search, 这样能解决大数组超时耗时问题

下面是我从 php 官网抄下来的笔记,可以观察这两个方法效率的差异

原网址:https://www.php.com/manual/en/function.in-array.php

If you're working with very large 2 dimensional arrays (eg 20,000+ elements) it's much faster to do this...
$needle = 'test for this';
$flipped_haystack = array_flip($haystack);
if ( isset($flipped_haystack[$needle]) )
{
 print "Yes it's there!";
}
I had a script that went from 30+ seconds down to 2 seconds (when hunting through a 50,000 element array 50,000 times).
Remember to only flip it once at the beginning of your code though!

更正

有人提出意见说道,array_flip 效率比 in_array 和 array_search 高,做了一些实验,确实如此。这点是我原来没有考虑到问题。这个解决办法,适用于多次使用 in_array 和 array_search 函数,才有效。下面是自己做实验的结果。感谢 @木偶指出的问题

<?php
$array = array();
for ($i=0; $i<200000; $i++){
 ##随机字符串
 $array[$i] = get_rand().$i;
}
$str = $array[150000];
$time1 = microtime(true);
array_search($str, $array);
$time2 = microtime(true);
echo '原始方法:'.($time2-$time1)."
";
$time3 = microtime(true);
$new_array = array_flip($array);
isset($new_array[$str]);
$time4 = microtime(true);
echo '新方法:'.($time4-$time3);

结果:

原始方法:0.0010008811950684
新方法:0.0069980621337891

循环 5000 次

$array = array();
for ($i=0; $i<200000; $i++){
 ##随机字符串
 $array[$i] = get_rand().$i;
}
$str = $array[199999];
$time1 = microtime(true);
for ($i=0; $i<5000; $i++){
 array_search($str, $array);
}
$time2 = microtime(true);
echo '原始方法:'.($time2-$time1)."
";
$time3 = microtime(true);
$new_array = array_flip($array);
for ($i=0; $i<5000; $i++){
 isset($new_array[$str]);
}
$time4 = microtime(true);
echo '新方法:'.($time4-$time3);

结果:

原始方法:2.9000020027161
新方法:0.008030891418457

热心网友 时间:2022-05-10 14:36

hotdigger正解
不过会出现个问题就是array中的原始数据丢失
另外在统一转为为小写的时候还是要foreach
foreach之后再调用函数
不如直接在foreach的过程中判断
foreach ($a as $value)
{
if (strtolower($value) == strtolower($b))
{
echo true;
break;
}
}追问请问一下 $b 不能是数组吧。
Warning: strtolower() expects parameter 1 to be string, array given in C:\post.php on line 26

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
个人账户养老金预测公式:现有5万元,缴费20年,能领多少钱? 临沂比较有名的男装品牌 呼伦贝尔市悦动网络科技有限公司怎么样? 呼伦贝尔中汇实业有限公司怎么样? 呼伦贝尔油玉不绝电子商务有限公司怎么样? 如何避免wps卡顿? 属鼠的男人找对象是属什么,属鼠的人和什么属相合 96年鼠的姻缘在哪年 属相相合年份运势提升 2024属鼠找对象属什么最佳 黑客攻击网站能报案吗 360手机安全卫士 短信拦截 意外伤害险有年龄限制吗 微信怎么位置怎么改成国外的 带倒车影像的行车记录仪后摄像头怎么接线 这个是行车记录仪后摄像头线请问师傅怎么接 自制活页本需要哪些配件 苹果7 Plus手机? 手机能交网费吗? 手机可以交网费吗 手机交网费怎么交 网费在手机上可以交吗 去手机店本来是想缴宽带费但是绑定的手机号没用了她帮我绑定了另外的号码但还没有改宽带账号会不会扣费? 手机店里能交联通宽带费吗 手机店里可不可以交网费,交网费要哪些东西 满天星表多少钱 满天星多少钱一包 这烟多少钱一包啊? 这种黄鹤楼香烟多少钱一盒?拜托各位大神 黄鹤楼满天星多少钱一包啊? 抱枕上的一颗一颗的黑点点是什么 腾讯和360分别是哪个国家的??是不是中国的? 我才买的车险怎么标志上写的2019年 在《小巨人运动会》中看到新西特乳铁蛋白调制乳粉可以增强免疫力,孕妇可以吃吗? 如何设置ins只对固定国家 满了55岁但还没满56岁能买人身意外险吗 车辆保险标志从2019年5月1日不贴标志对吗 想给父母买一份老年人意外伤害险 请问一下以6开头19位的银行卡是那个行的?急!!! 为什么银行卡号前面都是6开头呢? 问一下银行卡4字开头和6字开头都啥意思 三星s6手机屏幕里面有叫车的水印怎么去掉 三星s6 移动定制版g9208出现明显的类似水印的东西。求大神解决! 三星s6 edge+的屏幕水印是通病吗 三星s6在阳光底下屏幕里面有水印 三星s6曲面屏右下角进水了而且有水印,导致返回键有时候有反应有时候没反应,请问怎么解决,能清洗屏幕 三星s6屏幕上有个白印怎么回事 三星s6屏幕黑点,有印,有线那个问题严重 三星s6屏幕摔烂了有绿色的光是怎么回事 三星s6手机屏幕出现这种情况怎么办 三星s6edge 手机中相机怎样才能有水印