php两个传参怎么传,PHP多维数组按值排序?
主要用到的PHP函数 array_multisort()
1.先实现指定多维数组一个字段排序根据二维数组的id值来排序,转换后的数组格式如下:
function arraySortByOneField($data, $field, $sort = SORT_DESC)
{
$field = array_column($data, $field);
array_multisort($field,$sort,$data);
return $data;
}
$data = array(0=>array('id'=>7, 'name'=>'Apple', 'age'=> 18),1=>array('id'=>8, 'name'=>'Bed', 'age'=>17),2=>array('id'=>6, 'name'=>'Cos', 'age'=>16),3=>array('id'=>5, 'name'=>'Cos', 'age'=>14));
$newArray = arraySortByOneField($data, 'id', SORT_DESC);
var_dump($newArray );
2.实现多维数组的指定两个字段排序根据二维数组的多个属性值来排序,转换后的数组格式如下:
function sortArrByManyField()
{
$args = func_get_args();
if(empty($args)){
return null;
}
$arr = array_shift($args);
if(!is_array($arr)){
throw new Exception("第一个参数不为数组");
}
foreach($args as $key => $field){
if(is_string($field)){
$temp = array();
foreach($arr as $index=> $val){
$temp[$index] = $val[$field];
}
$args[$key] = $temp;
}
}
$args[] = &$arr;//引用值
call_user_func_array('array_multisort',$args);
return array_pop($args);
}
$data = array(0=>array('id'=>7, 'name'=>'Apple', 'age'=> 18),1=>array('id'=>8, 'name'=>'Bed', 'age'=>17),2=>array('id'=>6, 'name'=>'Cos', 'age'=>16),3=>array('id'=>5, 'name'=>'Cos', 'age'=>14));
$newArray = arraySortByManyField($data, 'id', SORT_ASC, 'name', SORT_ASC, 'age', SORT_DESC);
var_dump($newArray );
在foreach循环的结果能帮解释下输出的结果原理是什么?
HP中的&传值引用的问题,在foreach循环的结果能帮解释下输出的结果原理是什么?
代码如下:
$arr = array('one','two','three');
foreach ($arr as &$value){ echo 'Value:'.$value.'
'; }
foreach ($arr as $value){ echo 'Value:'.$value.'
'; }
?>
输出结果:
Value:one
Value:two
Value:three
Value:one
Value:two
Value:two
第一次带&的foreach并没有改变数组的内容。。
而是最后一次循环$value引用了数组的最后一个项 (可以测试一下,在第一次循环结束后unset($value),第二次循环的结果就不会有变化),
在你第二个foreach也是使用的$value变量,这才造成了怪异的问题(可以换个变量,比如$val,输出的数组就不会有变化)。
第二个foreach是赋值给$value,但是这时的$value是引用的数组的最后一个值,
所以
第一次循环把one赋值给了最后一个值,
第二次把two赋值给最后一个,
第三次也就是最后一个已经在第二次循环被赋值为two,所以仍然是two。
apache如何配置php?
Apache是世界使用排名第一的Web服务器软件。它可以运行在几乎所有广泛使用的计算机平台上,由于其跨平台和安全性被广泛使用,是最流行的Web服务器端软件。程序员在开发PHP或者Java服务器程序的时候,都会选择将Apache服务器作为后台服务器。很多朋友在安装apache后都不知该如何配置,下面广东锐讯网络就apache配置问题为大家详细讲解一下。
一、进入apache文件夹进行配置
1、Apache的配置主要集中在httpd.conf文件,它位于你的安装目录,比如:我安装在
2、用编辑器打开httpd.conf文件,先来查找到如下这一行:#ServerName,我们可以得到如下这一行内容:#ServerAdmin www.admin:80,这就是我们的主机名了,我们可以将前面的“#”去掉,并将其改为:ServerName 127.0.0.1:80
3、改完后存盘,在重启你的Apache2.2前我们先测试一下我们的Apache的配置文件是否改得对:
4、如果在你点了Test Configuration后,黑屏一闪而过,说明你的改动无误,不然这个黑屏会一直停留在当前状态,并且告诉你,你的配置改动有错,错在哪里。重新启动你的Apache。
5、找到如下这行:DocumentRoot,你会发下有这样的一行内容:DocumentRoot "D:/Apache2.2/htdocs"
6、这个叫作DocumentRoot即webroot,即:发布目录,发布在这个目录下的任何工程都会在Apache服务开启时被装载成标准的web工程,我们现在动手来把这个WebRoot定位到我们自己的发布目录中去吧。
DocumentRoot "D:/www"
7、我们把它改到了d盘的www目录中去了,然后我们在该目录中放入一个index.html文件,内容为:我更改到D盘www目录啦
8、重启我们的Apache服务,来测试一下:我们得到了什么?禁止访问,为什么?
Forbidden
You don't have permission to access / on this server.
9、找到下面这一段:把这个”deny from all”改成”allow fromall’吧。
Options FollowSymLinks
AllowOverride None
Order deny,allow
deny from all 最后一句改为: allow from all
10、修改完后重启你的Apache服务,我们的Apache的发布目录已经成功更改到了d:\www目录下了。
二、Apache后配置后如何设置?
①、ServerRoot 配置:主要用于指定Apache的安装路径,此选项参数值在安装Apache时系统会自动把Apache的路径写入。Windows安装时,该选项的值为Windows安装的路径,Linux安装时该选项值为编译时选择的路径;
②、 Dynamic Shared Object (DSO) Support(动态共享对象支持):添加Apache一些动态模块,比如php支持模块。重定向模块,认证模块支持,注意如果需要添加某些模块支持,只需把相关模块前面注释符号取消掉。要对Apache添加某个功能模块,把前面的注释符号去掉就行;
③、 Apache运行用户配置:指定Apache服务的运行用户和用户组,默认为:daemon;
④、 Apache服务默认管理员地址设置:管理员通知邮箱地址,选择默认值即可,如果有真实的邮箱地址也可以设置此值;
⑤、 Apache的默认首页、默认服务名及端口、.ht文件访问、日志文件配置设置:默认参数值设置为:ServerName localhost:80;
⑥、 Apache的根目录访问控制设置:主要是针对用户对根目录下所有的访问权限控制,默认Apache对根目录访问都是拒绝访问;
⑦、 Apache的默认网站根目录设置及访问控制:默认对网站的根目录具有访问权限,设置,默认值;
⑧、 URL重定向,cgi模块配置说明:主要包含一些URL重定向,别名,脚本别名等相关设置,以及一些特定的处理程序,比如cgi设置说明;
⑨、 MIME媒体文件,以及相关http文件解析配置说明:主要包含一些mime文件支持,以及添加一些指令在给定的文件扩展名与特定的内容类型之间建立映射关系,比如添加对php文件扩展名映射关系;
⑩、 Apache服务器补充设置,主要包括:服务器池管理,多语言错误消息,动态目录列表形式配置,语言设置,用户家庭目录,请求和配置上的实时信息,虚拟主机,Apache Http Server手册,分布式创作和版本控制,多种类默认设置,mod_proxy_html,使其支持HTML4/XHTML1等等补充配置的补充; Apache服务器安全连接设置主要是关于服务器安全连接设置,用于使用https连接服务器等设置的地方。
其实Apache普遍适合初级玩家,因年代久远,作为web应用服务器,每个请求都会占用一个进程处理,进程非常占资源 ,而且当并发量大的时候,就需要等额的进程,导致高内存、CPU的占用。虽然对java程序员来说apache基本是鸡肋,就apache来说,静态比不过nginx,动态和weblogic/jboss这些比又不是一个档次。但胜在它简单易学好操作啊,作为站长新手,知道Web服务器压力测试的工具,我们就别搞那么高大上的软件。
实时生成并下载大数据量的EXCEL文件?
对于任何一个网站肯定是少不了下载功能,常见的下载功能有图片、视频、Excel表格,如果文件比较小的话,那么不会遇到任何的问题,但是当文件信息而超过了PHP的最大内存,那么在这个时候它就会有的内存溢出的问题。
那么它们是因为什么而发生的?对于这个过程的原理才是我们应该真正要去弄明白的事情
下载大数据量的EXCEL文件为何要报错?PHP在下载大Excel表格的时候,那么首先它是需要去把MySQL的数据从硬盘上面读取到内存,但读取它是一次性载入到我们的内存,如果说它一次性载入的数据量远远大于最大内存,然后再来执行浏览器的业务下载。那么这个时候它就会发生我们这个内存溢出。
就比如:说我们现在有100M的数据量,但是我们PHP内存最大只有64M,那么这个它肯定是装不了的,我们可以把那个内存比喻为一个水杯,这个水杯的容量比喻为内存,现在杯子最大容量为64L。你要存放100L。肯定放不下
大事化小,小事化了。拆分成段从上面可以看到文件下载,它是分为两步,首先是载入内存然后执行浏览器的输出下载,那么既然大型文件一次性载入不了,那可以采用 “大事化小,小事化了”思路,我们可以实现边写边下载,也就是分批次的读取与写入。
因为用户的话,只要最终拿到这个文件就可以,对于浏览器的下载原理不需要关心。只需要给到文件下载提示给用户即可,然后后端在实时的分批次的写入到要下载的文件当中。
实现思路步骤:
1、一设置浏览器下载Excel需要的Header
2、打开 php://output 流,并设置写入文件句柄。
注:(php://output,是一个可写的输出流,允许程序像操作文件一样将输出写入到输出流中,PHP会把输出流中的内容发送给web服务器并返回给发起请求的浏览器)
3、获取数据库所有数据量,并设置每次查询的条数,通过这两个值计算分批查询的次数
4、基于分批查询的次数循环查询数据库,然后写入到文件中,同时清除本次操作变量内存,刷新缓冲到浏览器,让浏览器的文件始终实时保持到最新的大小
注:刷新用ob_flush、flush()PHP的I/O流在这里我们用到了PHP的一个IO的输入输出,也就是我们常用的
php://input php://output。php://input
php://input可以读取原始的POST数据。相较于$HTTP_RAW_POST_DATA而言,它给内存带来的压力较小,并且不需要特殊的php.ini设置。php://input不能用于enctype=multipart/form-data”.
注:HTTP_RAW_POST_DATA 在PHP7已经被废弃,它不是$_POST额php://output
php://output 是一个只写的数据流, 允许你以 print 和 echo 一样的方式 写入到输出缓冲区。
综上:实现思维与原理很重要如有感悟,欢迎关注额。(* ̄︶ ̄)php怎样传参不会被注入?
防止注入的几种办法:
首先,通过系统函数间的过滤特殊符号addslashes(需要被过滤的内容)。
1、register_globals = off 设置为关闭状态。
2、sql语句书写时尽量不要省略小引号和单引号
select * from table where id=2 (不规范)
select * from ·table· where ·id·=’2’ (规范)。
3、正确的使用 $_post $_get $_session 等接受参数,并加以过滤。
4、提高数据库教程命名技巧,对于一些重要的字段可根据程序特点命名。
5、对于常用方法加以封装,避免直接暴露sql语句。