数据排序有很多现成的函数,但是如果想对指定字段进行排序就没有内置函数了,下面我整理了一些相关的数组排序函数与大家一起交流学习学习。
先不说别的我们直接看二维数组按某个字段排序实例
代码如下 |
复制代码 |
<?php
/**
* @author yebihai http://www.111cn.net
* @desc 按二维数组的某一个字段进行升降排序
* @data
* $testData = array(
array('price'=>19),
array('price'=>121),
array('price'=>115),
array('price'=>113),
array('price'=>112)
);
*/
class sortClass{
//升序
function sortArrayAsc($preData,$sortType='price'){
$sortData = array();
foreach ($preData as $key_i => $value_i){
$price_i = $value_i[$sortType];
$min_key = '';
$sort_total = count($sortData);
foreach ($sortData as $key_j => $value_j){
if($price_i<$value_j[$sortType]){
$min_key = $key_j+1;
break;
}
}
if(empty($min_key)){
array_push($sortData, $value_i);
}else {
$sortData1 = array_slice($sortData, 0,$min_key-1);
array_push($sortData1, $value_i);
if(($min_key-1)<$sort_total){
$sortData2 = array_slice($sortData, $min_key-1);
foreach ($sortData2 as $value){
array_push($sortData1, $value);
}
}
$sortData = $sortData1;
}
}
return $sortData;
}
//降序
function sortArrayDesc($preData,$sortType='price'){
$sortData = array();
foreach ($preData as $key_i => $value_i){
$price_i = $value_i[$sortType];
$min_key = '';
$sort_total = count($sortData);
foreach ($sortData as $key_j => $value_j){
if($price_i>$value_j[$sortType]){
$min_key = $key_j+1;
break;
}
}
if(empty($min_key)){
array_push($sortData, $value_i);
}else {
$sortData1 = array_slice($sortData, 0,$min_key-1);
array_push($sortData1, $value_i);
if(($min_key-1)<$sort_total){
$sortData2 = array_slice($sortData, $min_key-1);
foreach ($sortData2 as $value){
array_push($sortData1, $value);
}
}
$sortData = $sortData1;
}
}
return $sortData;
}
} |
后面整理一些关于数组排序的函数
数据排序函数有
•sort() 函数用于对数组单元从低到高进行排序。
•rsort() 函数用于对数组单元从高到低进行排序。
•asort() 函数用于对数组单元从低到高进行排序并保持索引关系。
•arsort() 函数用于对数组单元从高到低进行排序并保持索引关系。
•ksort() 函数用于对数组单元按照键名从低到高进行排序。
•krsort() 函数用于对数组单元按照键名从高到低进行排序。
array_multisort() 函数对多个数组或多维数组进行排序
文章给大家整理两个PHP多线程了,一个是模仿java的多线程了,另一个是使用了curl实现多线程序采集图片了,下面我们一起来看看。
通过WEB服务器来实现PHP多线程功能。
当然,对多线程有深入理解的人都知道通过WEB服务器实现的多线程只能模仿多线程的一些效果,并不是真正意义上的多线程。
但不管怎么样,它还是能满足我们的一些需要的,在需要类似多线程的功能方面还是可以采用这个类。
代码如下 |
复制代码 |
/**
* @title: PHP多线程类(Thread)
* @version: 1.0
* @author: phper.org.cn < web@phper.org.cn >
* @published: 2010-11-2
*
* PHP多线程应用示例:
* require_once 'thread.class.php';
* $thread = new thread();
* $thread->addthread('action_log','a');
* $thread->addthread('action_log','b');
* $thread->addthread('action_log','c');
* $thread->runthread();
*
* function action_log($info) {
* $log = 'log/' . microtime() . '.log';
* $txt = $info . "rnrn" . 'Set in ' . Date('h:i:s', time()) . (double)microtime() . "rn";
* $fp = fopen($log, 'w');
* fwrite($fp, $txt);
* fclose($fp);
* }
*/
class thread {
var $hooks = array();
var $args = array();
function thread() {
}
function addthread($func)
{
$args = array_slice(func_get_args(), 1);
$this->hooks[] = $func;
$this->args[] = $args;
return true;
}
function runthread()
{
if(isset($_GET['flag']))
{
$flag = intval($_GET['flag']);
}
if($flag || $flag === 0)
{
call_user_func_array($this->hooks[$flag], $this->args[$flag]);
}
else
{
for($i = 0, $size = count($this->hooks); $i < $size; $i++)
{
$fp=fsockopen($_SERVER['HTTP_HOST'],$_SERVER['SERVER_PORT']);
if($fp)
{
$out = "GET {$_SERVER['PHP_SELF']}?flag=$i HTTP/1.1rn";
$out .= "Host: {$_SERVER['HTTP_HOST']}rn";
$out .= "Connection: Closernrn";
fputs($fp,$out);
fclose($fp);
}
}
}
}
}
|
使用方法:
代码如下 |
复制代码 |
$thread = new thread();
$thread->addthread('func1','info1');
$thread->addthread('func2','info2');
$thread->addthread('func3','info3');
$thread->runthread();
|
说明:
addthread() 是添加线程函数,第一个参数是函数名,之后的参数(可选)为传递给指定函数的参数。
runthread() 是执行线程的函数。
例2.利用curl实现多线程下载图片
其实是php利用curl实现的一个多线程类),有了这个类,我们也可利用该类执行多线程任务了!
代码如下 |
复制代码 |
<?php
class curl_multi{
private $url_list=array();
private $curl_setopt=array(
'CURLOPT_RETURNTRANSFER' => 1,//结果返回给变量
'CURLOPT_HEADER' => 0,//是否需要返回HTTP头
'CURLOPT_NOBODY' => 0,//是否需要返回的内容
'CURLOPT_FOLLOWLOCATION' => 0,//自动跟踪
'CURLOPT_TIMEOUT' => 6//超时时间(s)
);
function __construct($seconds=30){
set_time_limit($seconds);
}
/*
* 设置网址
* @list 数组
*/
public function setUrlList($list=array()){
$this->url_list=$list;
}
/*
* 设置参数
* @cutPot array
*/
public function setOpt($cutPot){
$this->curl_setopt=$cutPot+$this->curl_setopt;
}
/*
* 执行
* @return array
*/
public function execute(){
$mh=curl_multi_init();
foreach($this->url_list as $i=>$url){
$conn[$i]=curl_init($url);
foreach($this->curl_setopt as $key => $val){
curl_setopt($conn[$i],preg_replace('/(CURLOPT_w{1,})/ie','$0',$key),$val);
}
curl_multi_add_handle($mh,$conn[$i]);
}
$active=false;
do{
$mrc=curl_multi_exec($mh,$active);
}while($mrc == CURLM_CALL_MULTI_PERFORM);
while($active and $mrc == CURLM_OK){
if(curl_multi_select($mh) != -1){
do{
$mrc=curl_multi_exec($mh,$active);
}while($mrc == CURLM_CALL_MULTI_PERFORM);
}
}
$res=array();
foreach($this->url_list as $i => $url){
$res[$i]=curl_multi_getcontent($conn[$i]);
curl_close($conn[$i]);
curl_multi_remove_handle($mh,$conn[$i]);//释放资源
}
curl_multi_close($mh);
return $res;
}
}
|
php使用多线程下载类示例:下载远程图片
代码如下 |
复制代码 |
$curl_mul=new curl_multi();
$curl_mul->setUrlList(array('http://www.111cn.net/img/logo.jpg','http://www.111cn.net/img/logo.jpg','http://www.111cn.net/img/logo.jpg'));
$a=$curl_mul->execute();
$i=1;
foreach($a as $v){
$filename=$i.'.gif';
$fp2=@fopen($filename,'a');
fwrite($fp2,$v);
fclose($fp2);
$i++;
}
|
最近配置了一台wamp环境的服务器,但发现时间与本地时间是地区别的,并且 利用time获取的时间再利用date显示有时差的,下面我们一起来导致原因与解决办法。
如果date时间不一致可以使用date_default_timezone_set设置时区:
代码如下 |
复制代码 |
<?php
//获取当前时间
echo date('Y-m-d H:i:s',time());
echo "<br>";
//对当前时间进行计算
echo date('Y-m-d H:i:s',time()-600); //减10小时
echo "<br>";
//时间戳转时间
echo date('Y-m-d H:i:s',1364277600);
//时间转时间戳(仅精确到秒)
echo strtotime("2013-03-26 14:00");
echo "<br>";
|
还有一种办法是修改php.ini中配置文件
方法一:
date_default_timezone_set('PRC');
没有返回值。下面再直接使用date函数就OK了
$time = date(Y."年".m."月".d."日".G."时".i."分");
方法二:
修改php.ini中的;date.timezone = 为date.timezone = "Asia/Shanghai"(或者改为date.timezone = “PRC”)并去掉前面的分号,重启Apache即可。
**一定记得加上引号哦
这里我们是介绍利用php的fgetcsv函数直接来读取.csv文件了,并不是真正的excel文件,如果要读取真正的excel文件我们需要使用插件了,下面我会简单介绍一下。
excel文件(.csv)
代码如下 |
复制代码 |
<?php
function getCSVdata($filename)
{
$row = 1;//第一行开始
if(($handle = fopen($filename, "r")) !== false)
{
while(($dataSrc = fgetcsv($handle)) !== false)
{
$num = count($dataSrc);
for ($c=0; $c < $num; $c++)//列 column
{
if($row === 1)//第一行作为字段
{
$dataName[] = $dataSrc[$c];//字段名称
}
else
{
foreach ($dataName as $k=>$v)
{
if($k == $c)//对应的字段
{
$data[$v] = $dataSrc[$c];
}
}
}
}
if(!empty($data))
{
$dataRtn[] = $data;
unset($data);
}
$row++;
}
fclose($handle);
return $dataRtn;
}
}
$aData = getCSVdata('all_www.111cn.net.csv');
foreach ($aData as $k=>$v ){
echo "http://".$v['a']."<br>";
}
?>
|
生成excel文件(csv)
代码如下 |
复制代码 |
<?php
header("Content-type:application/vnd.ms-excel");
header("Content-Disposition:attachment;filename=test_data.xls");
//输出内容如下:
echo "姓名"."t";
echo "年龄"."t";
echo "学历"."t";
echo "n";
echo "张三"."t";
echo "25"."t";
echo "本科"."t";
?>
|
上面只是简单的一些excel文件操作,如果说进行如编辑,修改,删除行表格操作我们可使用phpexcel插件来操作excel文件了
推荐阅读:利用phpexcel读取excel实现代码
自动保存常用于编辑器了,要实现数据定时保存我们会使用到ajax功能,下面我们再一起来看一个input输入框失去焦点自动保存输入框的数据实例
最近做一个输入框失去焦点时自动保存数据的功能,当然就是jQuery选择器选择input,blur时,ajax提交数据给php文件,php文件保存一下数据咯。主要是要注意一下中文的问题,所以中间需要转一下编码。
下面的实例是一个列表页,有一点类似excel了。
html代码:
代码如下 |
复制代码 |
<table width=”100%” align=”left” border=”0″ cellspacing=”0″ bgcolor=”#CCCCCC”>
<tr onmouseover=”this.className=’on’;” onmouseout=”this.className=”;” align=”center” id=”{$id}” bgcolor=”#FFFFFF”>
<td >{$id}</td>
<td ><input type=”text” id=”title_{$id}” value=”{$title}” onblur=”ajaxEdit(‘{$id}’,'title’);” ></td>
<td ><textarea id=”description_{$id}” rows=”4″ onblur=”ajaxEdit(‘{$id}’,'description’);” >{$description}</textarea></td>
<td ><a href=”view.php?aid={$id}” target=”_blank”>预览</a><a href=”edit.php?aid={$id}”>编辑</a></td>
</tr>
</table>
|
js代码:
代码如下 |
复制代码 |
<script type=”text/javascript”>
function Dd(i) {return document.getElementById(i);}
function ajaxEdit(aid,field){
var value = decodeURI(Dd(field+”_”+aid).value);
$.ajax({
type: “POST”,
url: “edit.php”,
data: {dopost:”ajaxSave”,aid:aid,field:field,value:value},
success: function(data){
if(data==”true”){//更新成功
Dd(field+”_”+aid).style.border=”#fff”;
}else{//更新失败
alert(“更新失败,可能是网速太慢”);
}
}
});
}
</script>
|
php代码:(引用了dedecms的函数、方法)
代码如下 |
复制代码 |
if($dopost==’ajaxSave’)
{
$value = urldecode(AutoCharset($value,”UTF-8″,”GB2312″));
//更新主表
$inQuery = “UPDATE `#@__archives` SET $field=’$value’ WHERE id=’$aid’”;
if($dsql->ExecuteNoneQuery($inQuery))
{
echo “true” ;
exit;
}else{
echo “false”;
exit;
}
}
|
方法二,定时保存草稿功能,防止数据意外丢失!
情况介绍,网站后台编辑器是采用了百度UEditor所见即所得编辑器,我们就是要实现自动定时保存编辑器里的内容。
编辑器的调用方式如下:
代码如下 |
复制代码 |
<script type="text/plain" id="content" name="content" style="width:800px;height:400px;"></script>
<script type="text/javascript">
var editor = new UE.ui.Editor();
editor.render('content');
</script>
|
在发表页面或编辑页的最后加入js调用标签:
<!--自动保存功能 防止数据意外丢失-->
代码如下 |
复制代码 |
<script type="text/javascript"" width=100% src="localStorag.js"></script>
|
localStorag.js 的代码如下:
代码如下 |
复制代码 |
/*注意: 本js脚本请在网页源代码最后的地方放置*/
if(!window.localStorage){
alert('您的浏览器不支持 localStorage 技术!');
}else{
var spanObj = document.getElementById('s1');
var saveTimer= setInterval(function(){
var str="";
if(document.all){/*IE*/ str=document.frames[1].document.body.innerHTML; }
else{/*Chrome,ff*/ str=document.getElementById("ueditor_0").contentDocument.body.innerHTML; }
if(str.length>20 && (str.indexOf("。")>-1 || str.indexOf(",")>-1)){ /*有内容才保存 且有句号或逗号*/
localStorage.setItem("ctValue", str);
var d = new Date();
var YMDHMS = d.getFullYear() + "-" +(d.getMonth()+1) + "-" + d.getDate() + " " + d.getHours() + ":" + d.getMinutes() + ":" + d.getSeconds();
spanObj.innerText='(数据保存于: '+YMDHMS+')';
setTimeout(function(){ spanObj.innerText=''; },5000);
}
},25000); //每隔N秒保存一次
function stoplocs(){
clearInterval(saveTimer); //停止保存
//localStorage.removeItem("ctValue"); //清空
}
function showlocs(){
var html = localStorage.getItem("ctValue");
editor.setContent(html);
//alert(localStorage.getItem("ctValue"));
}
}
|
可以增加停止保存按钮或立即恢复按钮,如下:
代码如下 |
复制代码 |
<a href="javascript:void(0)" onclick="javascript:stoplocs()">停止保存</a>
<a href="javascript:void(0)" onclick="javascript:showlocs()">立即恢复</a>
|
好了,现在你的网站发表页面/编辑页面就具备自动保存功能了。注意这种方式支持IE8及以上版本的IE,CHROME,Firefox等等大多数主流浏览器。至于IE6,实在是老掉牙了,不在考虑范围内。如果一定要考虑IE6的,请使用上面提供的IE6/ie7兼容方案。
标签:[!--infotagslink--]