首页 > 编程技术 > php

PHP二维数组怎么按某个字段排序?

发布时间:2016-11-25 15:43

数据排序有很多现成的函数,但是如果想对指定字段进行排序就没有内置函数了,下面我整理了一些相关的数组排序函数与大家一起交流学习学习。

先不说别的我们直接看二维数组按某个字段排序实例

 代码如下 复制代码
<?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显示有时差的,下面我们一起来导致原因与解决办法。

Unix时间戳

如果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--]

您可能感兴趣的文章: