仓酷云

标题: PHP教程之PHP数组交集的优化代码剖析 [打印本页]

作者: 兰色精灵    时间: 2015-2-3 23:39
标题: PHP教程之PHP数组交集的优化代码剖析
告诉你了一个方式,但是缺少努力这一环节,那也是白搭。   不外因为手机的参数多,且分歧的手机其参数差别大,所以参数表布局凡是是纵表(一个参数是一行),而不是横表(一个参数是一列),此时利用若干参数来取了局,凡是就是把每一个独自参数来取了局,再一同取交集。
假定每一个参数会包括一千个摆布的独一了局(id int),以此为条件来摹拟生成一些数据:
复制代码 代码以下:
<?php
$rand = function() {
$result = array();
for ($i = 0; $i < 1000; null) {
$value = mt_rand(1, 10000);
if (!isset($result[$value])) {
$result[$value] = null;
$i++;
}
}
return array_keys($result);
};
$param_a = $rand();
$param_b = $rand();
?>

注重:假如测试数据集太小的话,结论能够会呈现纷歧致,先来看看经由过程PHP内置办法array_intersect完成的功能:
复制代码 代码以下:
<?php
$time = microtime(true);
$result = array_intersect($param_a, $param_b);
$time = microtime(true) - $time;
echo "array_intersect: {$time}\n";
?>

再来看看经由过程自界说办法intersect完成的功能:
复制代码 代码以下:
<?php
function intersect() {
if (func_num_args() < 2) {
trigger_error('param error', E_USER_ERROR);
}
$args = func_get_args();
foreach ($args AS $arg) {
if (!is_array($arg)) {
trigger_error('param error', E_USER_ERROR);
}
}
$intersect = function($a, $b) {
$result = array();
$length_a = count($a);
$length_b = count($b);
for ($i = 0, $j = 0; $i < $length_a && $j < $length_b; null) {
if($a[$i] < $b[$j]) {
$i++;
} else if($a[$i] > $b[$j]) {
$j++;
} else {
$result[] = $a[$i];
$i++;
$j++;
}
}
return $result;
};
$result = array_shift($args);
sort($result);
foreach ($args as $arg) {
sort($arg);
$result = $intersect($result, $arg);
}
return $result;
}
$time = microtime(true);
$result = intersect($param_a, $param_b);
$time = microtime(true) - $time;
echo "intersect: {$time}\n";
?>

直觉上,咱们一定会以为内置函数快于自界说函数,但本例中了局恰好相反:
array_intersect: 0.023918151855469
intersect: 0.0026049613952637
需求提示人人的是,array_intersect和intersect在功效上其实不完整等价,例子以下:
复制代码 代码以下:
$param_a = array(1, 2, 2);
$param_b = array(1, 2, 3);
var_dump(
array_intersect($param_a, $param_b),
intersect($param_a, $param_b)
);

array_intersect: 1, 2, 2
intersect: 1, 2
也就是说,假如在第一个数组参数中有反复元素的话,则array_intersect会前往一切知足前提的反复元素,而不是仅仅前往一个,有乐趣的读者可以变换一下参数按次再看了局。
再絮聒一下,最后我写intersect办法时,也许写成上面这个模样:
复制代码 代码以下:
<?php
function intersect() {
if (func_num_args() < 2) {
trigger_error('param error', E_USER_ERROR);
}
$args = func_get_args();
foreach ($args AS $arg) {
if (!is_array($arg)) {
trigger_error('param error', E_USER_ERROR);
}
}
$result = array();
$data = array_count_values(
call_user_func_array('array_merge', $args)
);
foreach ($data AS $value => $count) {
if ($count > 1) {
$result[] = $value;
}
}
return $result;
}
?>

代码更简约,不外有一个坏处,由于利用了array_merge,所以当数组中元素十分多的时分,占用的内存会对照大,反之假如数组中元素不长短常多,那末此办法也是可行的。(来历:火丁笔记)PHP成功的插入,删除,更新数据的时候,显然,你已经距离成功指日可待了。
作者: 山那边是海    时间: 2015-2-4 04:48
装在C盘下面可以利用windows的ghost功能可以还原回来(顺便当做是重转啦),当然啦我的编译目录要放在别的盘下,不然自己的劳动成果就悲剧啦。
作者: 再现理想    时间: 2015-2-9 15:52
有时候汉字的空格也能导致页面出错,所以在写代码的时候,要输入空格最好用引文模式。
作者: 变相怪杰    时间: 2015-2-27 09:07
php是动态网站开发的优秀语言,在学习的时候万万不能冒进。在系统的学习前,我认为不应该只是追求实现某种效果,因为即使你复制他人的代码调试成功,实现了你所期望的效果,你也不了解其中的原理。
作者: 若天明    时间: 2015-3-6 22:10
这些中手常用的知识,当你把我说的这些关键字都可以熟练运用的时候,你可以选择自己
作者: 深爱那片海    时间: 2015-3-10 02:43
建数据库表的时候,int型要输入长度的,其实是个摆设的输入几位都没影响的,只要大于4就行,囧。
作者: 活着的死人    时间: 2015-3-13 23:09
有时候汉字的空格也能导致页面出错,所以在写代码的时候,要输入空格最好用引文模式。
作者: 柔情似水    时间: 2015-3-20 21:23
本文当是我的笔记啦,遇到的问题随时填充
作者: 第二个灵魂    时间: 2015-3-22 01:09
,熟悉html,能用div+css,还有javascript,优先考虑linux。我在开始学习的时候,就想把这些知识一起学习,我天真的认为同时学习能够互相呼应,因为知识是相通的。
作者: 小女巫    时间: 2015-3-31 10:31
我要在声明一下:我是个菜鸟!!我对php这门优秀的语言也是知之甚少。但是我要在这里说一下php在网站开发中最常用的几个功能:
作者: 分手快乐    时间: 2015-4-6 00:10
实践是检验自己会不会的真理。
作者: 小魔女    时间: 2015-4-7 05:20
找到的的资料很多都是在论坛里的,需要注册,所以我一般没到一个论坛都注册一个id,所有的id都注册成一样的,这样下次再进来的时候就不用重复注册啦。当然有些论坛的某些资料是需要的付费的。
作者: 若相依    时间: 2015-4-8 07:49
在学习的过程中不能怕麻烦,不能有懒惰的思想。学习php首先应该搭建一个lamp环境或者是wamp环境。这是学习php开发的根本。虽然网络上有很多集成的环境,安装很方便,使用起来也很稳定、
作者: 飘灵儿    时间: 2015-4-10 00:00
首先声明:我是一个菜鸟,是一个初学者。学习了一段php后总是感觉自己没有提高,无奈。经过反思我认为我学习过程中存在很多问题,我改变了学习方法后自我感觉有了明显的进步。
作者: 莫相离    时间: 2015-4-17 12:51
当留言板完成的时候,下步可以把做1个单人的blog程序,做为目标,
作者: 只想知道    时间: 2015-4-29 02:19
再就是混迹于论坛啦,咱们的phpchina的论坛就很强大,提出的问题一般都是有达人去解答的,以前的帖子也要多看看也能学到不少前辈们的经验。别的不错的论坛例如php100,javaeye也是很不错的。
作者: 灵魂腐蚀    时间: 2015-5-4 04:22
其实也不算什么什么心得,在各位大侠算是小巫见大巫了吧,望大家不要见笑,若其中有错误的地方请各位大虾斧正。
作者: 老尸    时间: 2015-5-6 21:33
兴趣是最好的老师,百度是最好的词典。
作者: 谁可相欹    时间: 2015-5-9 01:15
在我安装pear包的时候老是提示,缺少某某文件,才发现 那群extension 的排列是应该有一点的顺序,而我安装的版本的排序不是正常的排序。没办法我只好把那群冒号加了上去,只留下我需要使用的扩展。
作者: 再见西城    时间: 2015-5-9 22:54
我还是强烈建议自己搭建php环境。因为在搭建的过程中你会遇到一些问题,通过搜索或是看php手册解决问题后,你会更加深刻的理解它们的工作原理,了解到php配置文件中的一些选项设置。




欢迎光临 仓酷云 (http://ckuyun.com/) Powered by Discuz! X3.2