PHP数组分组排序程序代码

 更新时间:2016年11月25日 15:40  点击:2174
php中数据排序可以用sort但如果要做到数组分组排序的话我们可以使用array_multisort函数或者使用多重复遍历来做,下面看一个例子。

PHP的数组,数组中的内容大致如下:

 代码如下 复制代码

$list = array(
    array(2,3,5),
    array(2,5,24),
    array(3,8,6),
    array(3,2,10),
    array(4,7,20),
    array(4,1,15),
    array(6,4,10),
    array(7,9,20),
    );

为了方便表达,我把3列数字分别称为,ABC三列

需求:默认以A列排序为主,如果A列相同则以C列倒序排列相同的元素。B列其实没有参与排序,但是在实际运用中有用,所以我也写出来了。

方法一:

 代码如下 复制代码

$a = $c = array();
foreach($list as $val){
    $a[] = $val[0]; //a列
    $c[] = $val[2]; //c列
}
//安装a列升序,然后安装b列降序 , 类似sql,orderby a asc,b desc
array_multisort($a,SORT_ASC , $c, SORT_DESC, $list);
print_r($list);

方法二:

 代码如下 复制代码

for($j=0;$j<count($list);$j++) {
    for($i=count($list)-1;$i>$j;$i--){
        if($list[$i][0] == $list[$i-1][0] && $list[$i][2] > $list[$i-1][2])
            list($list[$i],$list[$i-1]) = array($list[$i-1],$list[$i]);
    }
}

例子2

例如有下面的数据,从数据库里查出来的,是一个二维数组。
[0] => Array ( [trans_lang_id] => 1 [country_id] => 1 [trans_origin_id] => 1 [page_id] => 1 [trans_content] => test1
[1] => Array ( [trans_lang_id] => 2 [country_id] => 1 [trans_origin_id] => 2 [page_id] => 1 [trans_content] => test2
[2] => Array ( [trans_lang_id] => 3 [country_id] => 1 [trans_origin_id] => 3 [page_id] => 1 [trans_content] => test3
[3] => Array ( [trans_lang_id] => 4 [country_id] => 1 [trans_origin_id] => 4 [page_id] => 1 [trans_content] => test4
[4] => Array ( [trans_lang_id] => 6 [country_id] => 2 [trans_origin_id] => 1 [page_id] => 2 [trans_content] => test5

怎样按照country_id 和page_id分组,将里面的数据查分成多个数组?
也就是country_id和page_id相同的数据成为一个新数组。因为这样的数据会输出到同一个csv文件。
比如文件名为 zh_CN_1.csv。

 代码如下 复制代码

Array Translates:
US_en:Array (
        [1] => Array (
                    [0] => Array ( [0] => test [1] => 测试)
                    [1] => Array ( [0] => test [1] => 测试)
                    [2] => Array ( [0] => test [1] => 测试)
                    [3] => Array ( [0] => test [1] => 测试 )
                    )
            )

CN_zh:Array (
        [2] => Array (
                    [0] => Array ( [0] => There are no user contributed notes for this page. [1] => this belong to another country )
                        )
            )

        foreach ($translates as $translate) {
            $data[$translate["language_code"] . "_" . $translate['short_name'] ][$translate['page_id']][] = array($translate['content'], $translate['trans_content']);
        }
        foreach ($data as $locale_key => $item) {
            foreach ($item as $page_key => $csvContent) {
                $fileName = $locale_key . "_" . $page_key . ".csv";
                $translationFile->generateCSV($fileName, $csvContent);
            }

这样的话输出的CSV就像下面的结构:
zh_CN_1.csv
zh_CN_2.csv
en_US_1.csv
en_US_2.csv

每个csv里面可能有多条数据,就是那些国家语言以及page_id都相同的数据就放在同一个csv里

最近某个PHP项目用到了限制登录时间的功能,比如用户登录系统60分钟后如果没有操作就自动退出,我搜索了网络收集了有以下方法可供参考。

第一种方法即设置php.ini配置文件,设置session.gc_maxlifetime和session.cookie_lifetime节点属性值,当然也可以使用ini_set函数改变当前上下文环境的属性值:

 代码如下 复制代码
ini_set('session.gc_maxlifetime', "3600"); // 秒
ini_set("session.cookie_lifetime","3600"); // 秒

第二种方法即设置Session时间戳,比如下面的办法。


在登录成功时设置时间戳为当前时间推后1小时,$_SESSION['expiretime'] = time() + 3600;。在检查用户登录情况使用如下代码:

 代码如下 复制代码

if(isset($_SESSION['expiretime'])) {
    if($_SESSION['expiretime'] < time()) {
        unset($_SESSION['expiretime']);
        header('Location: logout.php?TIMEOUT'); // 登出
        exit(0);
    } else {
        $_SESSION['expiretime'] = time() + 3600; // 刷新时间戳
    }
}

经验,其实session超时时间php默认就有一会时间了,当然我们可以按上面的方法来设置一下了,这种做法我觉得使用cookies会更方便哦。

emlog使用的是文件缓存了,不管文件缓存多好也好不过memcache缓存了,关于memcache缓存优于文件缓存我们就不介绍了,下面简单的看看配置方法吧。

这次只是简单的HACK emlog cache程序,使用memcache缓存,毕竟memcache缓存在内存, 文件缓存在硬盘(要看I/O的性能),一般来说内存的性能大于硬盘,所以一般来说memcache缓存优于文件缓存。
memcache相对于文件缓存的优点:
1、读写性能优异,特别是高并发时和文件缓存比有明显优势。
2、memcached组建支持集群,并且是自动管理负载均衡

注意:memcache的原理是内存分块,单个item大于1M的数据存memcache和读取速度可能有点慢。
具体的情况这边我这里就不测试了,大家可以帮忙测试看看。

[2014-05-25]memcache 1.0beta
1、替换文件缓存为memcache缓存
2、去除文件缓存写入和读取

注意:虽然不涉及数据库操作,但是还是请在修改前备份数据
1、首先添加memcache类文件Mcache.php,放在include/lib文件夹下,服务器地址和端口地址在该文件中,请你自己配置

 代码如下 复制代码

<?php
/** 
 * 此类为单例模式,取得实例方法: $cache = MCache::getInstance();
 * @author Star.Yu <vip@myxzy.com>
 * @date 2014.5.25
 *
 */
class MCache{
 private static $_instance;
 private static $_connect_type = '';
 private $_memcache;
 
 /**
  * 私有化构造函数,禁止使用关键字new来实例Mcache类
  */
 private function __construct() {
  if (!class_exists('Memcache')) {
   throw new Exception('Class Memcache not exists');
  }
  $conn = self::$_connect_type;
  $this->_memcache = new Memcache();
  $this->_memcache->$conn('localhost', '11211');
 }
 
 /**
  * 克隆私有化,禁止克隆实例
  */
 private function __clone() {}
 
 /**
  * 类入口,通过此静态方法对类进行实例化
  */
 public static function getInstance($type = 'connect'){
  self::$_connect_type = ($type == 'connect') ? $type : 'pconnect';
  if (!self::$_instance instanceof self) {
   self::$_instance = new self();
  }
  return self::$_instance;
 }
 
 /**
  * 把数据添加到缓存
  * @param string $key 缓存的key
  * @param string|array|int... $value 缓存的数据
  * @param int $flag  使用zlib MEMCACHE_COMPRESSED
  * @param int $expire_time  缓存时间
  */
 public function set($key, $value,$flag = 0 ,$expire_time = 0){
   $this->_memcache->set($key, $value, $flag, $expire_time);  
 }

 /**
  * 替换缓存数据
  * @param string $key 缓存的key
  * @param string|array|int... $value 缓存的数据
  * @param int $flag  使用zlib MEMCACHE_COMPRESSED
  * @param int $expire_time  缓存时间
  */
 public function replace($key, $value,$flag = 0 , $expire_time = 0){
   $this->_memcache->replace($key, $value, $flag, $expire_time);  
 }
 
 /**
  * 从缓存读取数据
  * @param string|array|int... $key
  */
 public function get($key){
  return $this->_memcache->get($key);
 }
 
 /**
  * 从缓存删除数据
  * @param string|array|int... $key
  */
 public function del($key,$expire_time = 0){
  $this->_memcache->delete($key, $expire_time); 
 }

 public function close(){
 return $this->_memcache->close();
 }
}

2、修改include/lib/cache.php,添加实例,第28行修改为
 

 代码如下 复制代码

private function __construct() {
  $this->db = Database::getInstance();
  $this->memcache = MCache::getInstance();
 } 3、修改include/lib/cache.php的读写memcache缓存,大概507行下面的cacheWrite和readCache函数修改为
 /**
  * 写入缓存
  */
 function cacheWrite ($cacheData, $cacheName) {
  $this->memcache->set($cacheName,$cacheData);
 }

 /**
  * 读取缓存文件
  */
 function readCache($cacheName) {
  if($this->memcache->get($cacheName)===false){call_user_func(array($this, 'mc_' . $cacheName));}
  $data = $this->memcache->get($cacheName);
  $this->{$cacheName.'_cache'} = unserialize($data);
  return $this->{$cacheName.'_cache'};
 }

到此修改已经完毕,已经缓存了文件缓存到memcache缓存中了,如有什么问题可以留言评论。
卸载方法:如果不想用memcache缓存了,就用原版的cache.php替换掉修改的cache.php,然后删除Mcache.php即可

其实淘宝与百度这两个接口是开放的所以我几乎不需要做任务处理就可以直接来获取它样的下拦框内容,下面一起来看看。

淘宝和百度的接口,

百度: “suggestion.baidu.com/su?wd= 搜索内容 &p=3&t=1273278850500”
淘宝: “ suggest.taobao.com/sug?code=utf-8&callback=?&q=搜索内容”

下面看百度例子

 代码如下 复制代码

$abcs = mb_convert_encoding(trim($_POST["key"]),"utf-8","gb2312");           //接收传送过来的关键值
$skey = file_get_contents("http://suggestion.baidu.com/su?wd=".urlencode($abcs)."");        //访问百度页面


preg_match('/\[(.*?)\]/',$skey,$m);    //通过正则去掉
$s = explode(',',$m[1]);   
foreach($s as $k=>$v){
 $s[$k] = substr($v,1,-1);
}
var_dump($s);        //输出

对于淘宝我们也可以使用上面的代码来处理只是参数有点不同了,当然如果你想模仿用户可以使用curl来在此大家自行研究吧。

最近由于项目需要定时对远程数据库上做一些处理,这里就需要做一个计划任务样子的东西了。经过努力,终于使用php实现了这个计划任务,下面分享一下此次的实现过程。

本次使用php实现计划任务主要使用了 ignore_user_abort() set_time_limit(0) sleep() 这三个函数。

例子

 代码如下 复制代码

<?php
ignore_user_abort(); //即使Client断开(如关掉浏览器),PHP脚本也可以继续执行.
set_time_limit(0); // 执行时间为无限制,php默认的执行时间是30秒,通过set_time_limit(0)可以让程序无限制的执行下去
$interval=60*5; // 每隔5分钟运行
do{
$fp = fopen('test.txt','a');
fwrite($fp,'test');
fclose($fp);
sleep($interval); // 等待5分钟
}while(true);
?>


具体的代码如下:

 代码如下 复制代码

<?php
ignore_user_abort();//该函数的作用是当用户关掉浏览器后,PHP脚本也可以继续执行.
set_time_limit(3000);// 通过set_time_limit(0)可以让程序无限制的执行下去
$interval=5;// 每隔5s运行
//方法1--死循环
do{
 echo '测试'.time().'<br/>';
 sleep($interval);// 等待5s   
}while(true);
//方法2---sleep 定时执行
require_once './curlClass.php';//引入文件
$curl=new httpCurl('www.phpernote.com');//实例化
$stime=$curl->getmicrotime();
for($i=0;$i<=10;$i++){
 echo '测试'.time().'<br/>';
 sleep($interval);// 等待5s
}
ob_flush();
flush();
$etime=$curl->getmicrotime();
echo '<hr>';
echo round(($etime-stime),4);//程序执行时间


函数int ignore_user_abort :

从函数名本身,可以解释为,"忽略用户的影响"
因为所谓的用户是指客户端,即浏览器
所以进一步解释为,"忽略浏览器的影响"

那么影响指的是什么,影响指的是浏览器的关闭和异常

也就是说有这个函数在的php程序,即使在浏览器关掉的时候,程序没有执行完它还会继续执行,直到执行完

比如说,你有一段代码需要执行100秒,可是这个时间太长了,一般用户等不及,在等了60秒的时候受不了就关了
如果这个时候程序也随之终止,很可能造成数据异常,不一致或是错误,你需要程序继续运行,就可以用它了

它的参数就是真和假,真就是忽略,假就是不忽略

在具体的实现过程中个人感觉PHP定时执行任务的效率并不高,建议关于定时执行任务的工作还是交给shell来做吧,相对来说,这个方法实现的太过勉强,而shell是专业级别的了。

2、linux的脚本程序

这里主要使用到crontab这个命令,

使用方式 :

crontab   filecrontab [ -u user ] [ -u user ] { -l | -r | -e }

说明 :

crontab 是用来让使用者在固定时间或固定间隔执行程式之用

使用crontab写shell脚本,然后让PHP调用shell,这个是利用linux的特性,应该还不算PHP自身语言的特性


在Crontab中使用URL执行脚本

如果你的PHP脚本可以通过URL触发,你可以使用lynx或curl或wget来配置你的Crontab。

下面的例子是使用Lynx文本浏览器访问URL来每小时执行PHP脚本。Lynx文本浏览器默认使用对话方式打开URL。但是,像下面的,我们在lynx命令行中使用-dump选项来把URL的输出转换来标准输出。

 代码如下 复制代码

00 * * * * lynx -dump http://www.111cn.net /script.php

下面的例子是使用CURL访问URL来每5分执行PHP脚本。Curl默认在标准输出显示输出。使用”curl -o”选项,你也可以把脚本的输出转储到临时文件。

 代码如下 复制代码
*/5 * * * * /usr/bin/curl -o temp.txt http://www.111cn.net /script.php

下面的例子是使用WGET访问URL来每10分执行PHP脚本。-q选项表示安静模式。”-O temp.txt”表示输出会发送到临时文件。

 代码如下 复制代码

*/10 * * * * /usr/bin/wget -q -O temp.txt http://www.111cn.net /script.php

[!--infotagslink--]

相关文章

  • php中eval()函数操作数组的方法

    在php中eval是一个函数并且不能直接禁用了,但eval函数又相当的危险了经常会出现一些问题了,今天我们就一起来看看eval函数对数组的操作 例子, <?php $data="array...2016-11-25
  • Python 图片转数组,二进制互转操作

    这篇文章主要介绍了Python 图片转数组,二进制互转操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-03-09
  • 不打开网页直接查看网站的源代码

      有一种方法,可以不打开网站而直接查看到这个网站的源代码..   这样可以有效地防止误入恶意网站...   在浏览器地址栏输入:   view-source:http://...2016-09-20
  • php 调用goolge地图代码

    <?php require('path.inc.php'); header('content-Type: text/html; charset=utf-8'); $borough_id = intval($_GET['id']); if(!$borough_id){ echo ' ...2016-11-25
  • php数组操作 键名比较 差集 交集赋值

    本文章提供在量的数据中级操作实例有如对键名比较计算数组的差集 计算差集 给指定数组中插入一个元素 反转数组 交集赋值新的数组实例。 //定义回调函数 funct...2016-11-25
  • antdesign-vue结合sortablejs实现两个table相互拖拽排序功能

    这篇文章主要介绍了antdesign-vue结合sortablejs实现两个table相互拖拽排序功能,本文通过实例图文相结合给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2021-01-09
  • C#二维数组基本用法实例

    这篇文章主要介绍了C#二维数组基本用法,以实例形式分析了C#中二维数组的定义、初始化、遍历及打印等用法,具有一定参考借鉴价值,需要的朋友可以参考下...2020-06-25
  • php curl模拟post请求和提交多维数组的示例代码

    下面一段代码给大家介绍php curl模拟post请求的示例代码,具体代码如下: <&#63;php$uri = "http://www.cnblogs.com/test.php";//这里换成自己的服务器的地址// 参数数组$data = array ( 'name' => 'tanteng'// 'passwor...2015-11-24
  • JS基于Mootools实现的个性菜单效果代码

    本文实例讲述了JS基于Mootools实现的个性菜单效果代码。分享给大家供大家参考,具体如下:这里演示基于Mootools做的带动画的垂直型菜单,是一个初学者写的,用来学习Mootools的使用有帮助,下载时请注意要将外部引用的mootools...2015-10-23
  • C#数组的常用操作方法小结

    Array数组在C#中同样是最基本的数据结构,下面为大家C#数组的常用操作方法小结,皆为细小的代码段,欢迎收看收藏...2020-06-25
  • JS+CSS实现分类动态选择及移动功能效果代码

    本文实例讲述了JS+CSS实现分类动态选择及移动功能效果代码。分享给大家供大家参考,具体如下:这是一个类似选项卡功能的选择插件,与普通的TAb区别是加入了动画效果,多用于商品类网站,用作商品分类功能,不过其它网站也可以用,...2015-10-21
  • JS实现自定义简单网页软键盘效果代码

    本文实例讲述了JS实现自定义简单网页软键盘效果。分享给大家供大家参考,具体如下:这是一款自定义的简单点的网页软键盘,没有使用任何控件,仅是为了练习JavaScript编写水平,安全性方面没有过多考虑,有顾虑的可以不用,目的是学...2015-11-08
  • php 取除连续空格与换行代码

    php 取除连续空格与换行代码,这些我们都用到str_replace与正则函数 第一种: $content=str_replace("n","",$content); echo $content; 第二种: $content=preg_replac...2016-11-25
  • php简单用户登陆程序代码

    php简单用户登陆程序代码 这些教程很对初学者来讲是很有用的哦,这款就下面这一点点代码了哦。 <center> <p>&nbsp;</p> <p>&nbsp;</p> <form name="form1...2016-11-25
  • PHP实现清除wordpress里恶意代码

    公司一些wordpress网站由于下载的插件存在恶意代码,导致整个服务器所有网站PHP文件都存在恶意代码,就写了个简单的脚本清除。恶意代码示例...2015-10-23
  • C#实现字符串转换成字节数组的简单实现方法

    这篇文章主要介绍了C#实现字符串转换成字节数组的简单实现方法,仅一行代码即可搞定,非常简单实用,需要的朋友可以参考下...2020-06-25
  • JS实现双击屏幕滚动效果代码

    本文实例讲述了JS实现双击屏幕滚动效果代码。分享给大家供大家参考,具体如下:这里演示双击滚屏效果代码的实现方法,不知道有觉得有用处的没,现在网上还有很多还在用这个特效的呢,代码分享给大家吧。运行效果截图如下:在线演...2015-10-30
  • js识别uc浏览器的代码

    其实挺简单的就是if(navigator.userAgent.indexOf('UCBrowser') > -1) {alert("uc浏览器");}else{//不是uc浏览器执行的操作}如果想测试某个浏览器的特征可以通过如下方法获取JS获取浏览器信息 浏览器代码名称:navigator...2015-11-08
  • js实现列表按字母排序

    这篇文章主要为大家详细介绍了js实现列表按字母排序,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-08-11
  • JS日期加减,日期运算代码

    一、日期减去天数等于第二个日期function cc(dd,dadd){//可以加上错误处理var a = new Date(dd)a = a.valueOf()a = a - dadd * 24 * 60 * 60 * 1000a = new Date(a)alert(a.getFullYear() + "年" + (a.getMonth() +...2015-11-08