PHP排序文件锁

//1、可用于并发处理:
/*  
    *   PHP 代码,确保多个进程同时写入同一个文件成功 
    *   核心思路:文件加锁 
    *   函数介绍: 
    *   (1)fopen — 打开文件或者 URL    resource fopen ( string $filename , string $mode [, bool $use_include_path = false [, resource $context ]] ) 
    *   'w+' 读写方式打开,将文件指针指向文件头并将文件大小截为零。如果文件不存在则尝试创建之。  
    *   成功时返回文件指针资源,如果打开失败,本函数返回 FALSE 
    *   (2)flock — 轻便的咨询文件锁定 bool flock ( resource $handle , int $operation [, int &$wouldblock ] ) 
    *   operation:LOCK_EX 取得独占锁定(写入的程序。即排它型锁定 
    *   operation:LOCK_UN 释放锁定(无论共享或独占) 
    *   arithmetic 
    */  
    $fp = fopen('./1.txt','w+');  
    if(flock($fp,LOCK_EX)){  
        // 获取到写锁,写数据  
        fwrite($fp,'qinruilovechuanggege');  
        // 释放锁定  
        flock($fp, LOCK_UN);  
    }else{  
        echo '有人正在使用文件';  
    }  
    fclose($fp);

//2、双向队列
    /*  
    *   PHP  实现一个双向队列 
    *   函数介绍: 
    *   (1)array_unshift    array_unshift — 在数组开头插入一个或多个单元 
    *   array_unshift(array,value1,value2,value3...);  
    *   array_unshift() 将传入的单元插入到 array 数组的开头。 
    *   注意单元是作为整体被插入的,因此传入单元将保持同样的顺序。 
    *   所有的数值键名将修改为从零开始重新计数,所有的文字键名保持不变。 
    *   (2)array_push — array_push — 将一个或多个单元压入数组的末尾(入栈)  
    *   array_push($stack, "apple", "raspberry"); 
    *   (3)array_shift array_shift — 将数组开头的单元移出数组  
    *   所有的数字键名将改为从零开始计数 
    *   将 array 的第一个单元移出并作为结果返回 
    *   (4)array_pop  array_pop — 将数组最后一个单元弹出(出栈) 
    *    弹出并返回 array 数组的最后一个单元 
    *   arithmetic 
    */  
    class Deque{  
        private $queue = array();  
        public function addFirst($item){  
            return array_unshift($this->queue, $item);  
        }  
        public function addLast($item){  
            return array_push($this->queue, $item);  
        }  
        public function removeFirst(){  
            return array_shift($this->queue);  
        }  
        public function removeLast(){  
            return array_pop($this->queue);  
        }  
    }  


//3、二维数组排序(很常用哦)
 /*  
    *   写一个二维数组排序算法函数,能够具有通用性,可以调用 php 内置函数 
    *   二维数组排序, $arr是数据,$keys是排序的健值,$order是排序规则,1是升序,0是降序 
    *   函数介绍: 
        详见下面的说明 
    *   arithmetic 
    */  
function array_sort($arr, $keys, $order=0) {  
    if (!is_array($arr)) {  
        return false;  
    }  
    $keysvalue = array();  
    foreach($arr as $key => $val) {  
        $keysvalue[$key] = $val[$keys];  
    }  
    if($order == 0){  
        asort($keysvalue);  
    }else {  
        arsort($keysvalue);  
    }  
    reset($keysvalue);  
    foreach($keysvalue as $key => $vals) {  
        $keysort[$key] = $key;  
    }  
    $new_array = array();  
    foreach($keysort as $key => $val) {  
        $new_array[$key] = $arr[$val];  
    }  
    return $new_array;  
}  
//注意多维数组的排序还少不了 array_mutisort
//1、array_multisort的用法:
$arr1 = array(  
    '0' => array('a' => 3, 'b' => 20, 'c' => 2, 'd' => 6),  
    '1' => array('a' => 3, 'b' => 2, 'c' => 2, 'd' => 6),  
    '2' => array('a' => 3, 'b' => 22, 'c' => 2, 'd' => 6),  
    '3' => array('a' => 3, 'b' => 25, 'c' => 2, 'd' => 6),  
    '4' => array('a' => 3, 'b' => 28, 'c' => 2, 'd' => 6),  
    '5' => array('a' => 3, 'b' => 3, 'c' => 2, 'd' => 6),  
);  
  
$arr2 = array(  
    'e1' => array('a' => 3, 'b' => 20, 'c' => 2, 'd' => 6),  
    'e2' => array('a' => 3, 'b' => 2, 'c' => 2, 'd' => 6),  
    'e3' => array('a' => 3, 'b' => 22, 'c' => 2, 'd' => 6),  
    'e4' => array('a' => 3, 'b' => 25, 'c' => 2, 'd' => 6),  
    'e5' => array('a' => 3, 'b' => 28, 'c' => 2, 'd' => 6),  
    'e6' => array('a' => 3, 'b' => 3, 'c' => 2, 'd' => 6),  
);  
  
//提取列数组;
foreach ($arr1 as $key => $val) {  
    $tmp[$key] = $val['b'];  
}  
  
array_multisort($tmp,SORT_DESC,$arr1);  
echo "<pre>";  
    print_r($arr1);  
echo "</pre>";  
  
array_multisort($tmp,SORT_DESC,$arr2);  
echo "<pre>";  
    print_r($arr2);  
echo "</pre>";  
  

//2、普通sort的用法:
$arr1 = array(  
    '0' => array('a' => 3, 'b' => 20, 'c' => 2, 'd' => 6),  
    '1' => array('a' => 3, 'b' => 2, 'c' => 2, 'd' => 6),  
    '2' => array('a' => 3, 'b' => 22, 'c' => 2, 'd' => 6),  
    '3' => array('a' => 3, 'b' => 25, 'c' => 2, 'd' => 6),  
    '4' => array('a' => 3, 'b' => 28, 'c' => 2, 'd' => 6),  
    '5' => array('a' => 3, 'b' => 3, 'c' => 2, 'd' => 6),  
);  
  
$arr2 = array(  
    'e1' => array('a' => 3, 'b' => 20, 'c' => 2, 'd' => 6),  
    'e2' => array('a' => 3, 'b' => 2, 'c' => 2, 'd' => 6),  
    'e3' => array('a' => 3, 'b' => 22, 'c' => 2, 'd' => 6),  
    'e4' => array('a' => 3, 'b' => 25, 'c' => 2, 'd' => 6),  
    'e5' => array('a' => 3, 'b' => 28, 'c' => 2, 'd' => 6),  
    'e6' => array('a' => 3, 'b' => 3, 'c' => 2, 'd' => 6),  
);  
  
function array_sort($array,$keys,$type='asc'){  
    //$array为要排序的数组,$keys为要用来排序的键名,$type默认为升序排序$keysvalue = $new_array = array();  
  
    //提取排序的列
    foreach ($array as $k=>$v){  
        $keysvalue[$k] = $v[$keys];  
    }  
    if($type == 'asc'){  
        asort($keysvalue);//升序排列  
    }else{  
        arsort($keysvalue);//降序排列  
    }  
    reset($keysvalue);foreach ($keysvalue as $k=>$v){  
        $new_array[$k] = $array[$k];  
    }  
    return $new_array;  
}  
$arr = array_sort($arr1,'b','desc'); //此处对数组进行降序排列  

// 思路总结:
// 总体的想法是这样的,要对一个多维数组按照某一个键值对排序,关键是先确定这个键值对的顺序,然后按照这个键值对的顺序去排列这个多维数组。

// 对于是数字索引的数组,第二种方法还是比较好的,因为它会保持数字索引,这个很好,而第一种就会把数字索引的数组重新建立数字索引;

// 对于是字符串索引的数组,两种方法都可以采用,完全看个人爱好。

// 接下来简单讲解array_multisort的参数。这个函数的参数很灵活。最简单的情况是如上面所示的以1个或n个数组作为参数,需要注意的是每个数组的项数要一样,否则会warning导致排序失效。
// 像这样array_multisort($arr1,$arr2,$arr3); 默认是所有数组都是升序排列,如果想对$arr2降序,并当作字符串去比较,就要写成:
// array_multisort($arr1, $arr2, SORT_DESC, SORT_STRING, $arr3);
// 每个array后面可以跟一个排序顺序标志或一个排序类型标志,或者两种标志同时出现。但是每种排序标志在每个数组后面只能出现一个。

// 详细如下:
// 排序顺序标志:
// SORT_ASC - 按照上升顺序排序(默认)
// SORT_DESC - 按照下降顺序排序
// 排序类型标志:
// SORT_REGULAR - 将项目按照通常方法比较(默认)
// SORT_NUMERIC - 将项目按照数值比较
// SORT_STRING - 将项目按照字符串比较

// 举个栗子:

  /** 
    * array_multisort的用法: 
    * 
    * 
    */  
    $arr1 = array(  
        '0' => array('a' => 3, 'b' => 20, 'c' => 1, 'd' => 6),  
        '1' => array('a' => 3, 'b' => 2, 'c' => 2, 'd' => 6),  
        '2' => array('a' => 3, 'b' => 22, 'c' => 2, 'd' => 6),  
        '3' => array('a' => 3, 'b' => 25, 'c' => 3, 'd' => 6),  
        '4' => array('a' => 3, 'b' => 28, 'c' => 4, 'd' => 6),  
        '5' => array('a' => 3, 'b' => 30, 'c' => 5, 'd' => 6),  
        '6' => array('a' => 3, 'b' => 28, 'c' => 6, 'd' => 6),  
        '7' => array('a' => 3, 'b' => 34, 'c' => 2, 'd' => 6),  
        '8' => array('a' => 3, 'b' => 35, 'c' => 10, 'd' => 6),  
    );  
    $arr2 = array(  
        'e1' => array('a' => 3, 'b' => 20, 'c' => 2, 'd' => 6),  
        'e2' => array('a' => 3, 'b' => 2, 'c' => 2, 'd' => 6),  
        'e3' => array('a' => 3, 'b' => 22, 'c' => 2, 'd' => 6),  
        'e4' => array('a' => 3, 'b' => 25, 'c' => 2, 'd' => 6),  
        'e5' => array('a' => 3, 'b' => 28, 'c' => 2, 'd' => 6),  
        'e6' => array('a' => 3, 'b' => 3, 'c' => 2, 'd' => 6),  
        'e7' => array('a' => 3, 'b' => 3, 'c' => 5, 'd' => 6),  
    );  
    foreach ($arr1 as $key => $value) {  
        $tmp[$key] = $value['b'];  
        $tmp1[$key] = $value['c'];  
    }  
    foreach ($arr2 as $key => $value) {  
        $tmp2[$key] = $value['b'];  
        $tmp3[$key] = $value['c'];  
    }  
    // array_multisort($tmp,SORT_ASC,$arr1);  
    array_multisort($tmp,SORT_DESC,$tmp1,SORT_ASC,$arr1); // 先按照$tmp降序排  在按照$tmp1升序排  
    echo "<pre>";  
        print_r($arr1);  
    echo "</pre>";  
    array_multisort($tmp2,SORT_ASC,$arr2);  
    echo "<pre>";  
        print_r($arr2);  
    echo "</pre>";  





posted on   何苦->  阅读(31)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
点击右上角即可分享
微信分享提示