仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 765|回复: 19
打印 上一主题 下一主题

[学习教程] PHP教程之PHP数组交集的优化代码剖析

[复制链接]
兰色精灵 该用户已被删除
跳转到指定楼层
#
发表于 2015-2-3 23:39:04 | 只看该作者 回帖奖励 |正序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

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

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-12-23 18:56

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表