我有两个像这样的字符串
$s1
我需要比较$s2
和$s1_ar=explode(".",$s1);
$s2_ar=explode(".",$s2);
$result=array_diff($s1_ar,$s2_ar);
$rt1=5-count($result);
if($result>=2){ echo "YES"; } else {echo "no"; }
,并找出是否有2个或更多共同的数字。
我正在使用这种方式
$s1
由于我需要数百万$s2
和local[*]
的值并且上面的代码似乎很慢,您是否知道更快地执行工作的替代方法?
答案 0 :(得分:0)
我使用以下代码测试了它,在我3岁的笔记本电脑上测试了一百万次,不到两秒钟。
循环1M次没时间,大部分时间用于显示。
注释显示,1M循环,0.816432秒
将结果保存到文件中,~13.564MB,0.731708秒
ob_start();
$t1 = microtime();
for($i=1; $i<=1000000; $i++) {
$s1="32.56.86.90.23";
$s2="10.25.30.90.10";
$s1_ar=explode(".",$s1);
$s2_ar=explode(".",$s2);
$result=array_diff($s1_ar,$s2_ar);
$rt1=5-count($result);
if($result>=2){ echo $i . " YES<br>"; } else {echo $i . " no<br>"; }
}
$out = ob_get_contents();
ob_end_clean();
var_dump($out);
echo '<p>'.(microtime() - $t1).'</p>';
答案 1 :(得分:0)
我想到了一种以2 * n复杂度解决这个问题的方法: 我们循环一个列表并从它的元素(LIST c)创建一个关联数组然后我们循环第二个列表并查找列表c是否包含这样的索引/键(c [element])。 这应该是非常轻的:
$commons = 0;
$s1_fliped = array_flip($s1_ar)
foreach($s2_ar as $s2_el){
if ( isset($s1_fliped[$s2_el]) ){
$commons ++;
}
if($commons >=2) break;
});
答案 2 :(得分:0)
试试这个。
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/jsp/" />
<property name="suffix" value=".jsp" />
</bean>
<!-- <bean id="reg" class="pgdac.RegHib"></bean> -->
<context:component-scan base-package="dac" />
</beans>
我认为它会解决你的目的。
答案 3 :(得分:0)
查看:php array_intersect() efficiency
有人提到array_intersect_key可能更有效率。但是真的有数据和版本比较结果会很好。
$s1 = "2.3.5.7.9.11.13.17";
$s2 = "2.3.4.5.6";
$s1 = array_flip(explode('.', $s1));
$s2 = array_flip(explode('.', $s2));
echo count(array_intersect_key($s1, $s2))>=2 ? 'yes' : 'no';
输出:
yes