• 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>";  
    
    
    
    
    
    
  • 相关阅读:
    shell编程之 ()[] {}
    mysql环境搭建
    CSS布局基础——BFC
    Java线程
    chrome developer tool—— 断点调试篇
    JavaScript技巧[转载]
    如何在github中创建演示demo
    rem在响应式布局中的应用
    javascript模块化
    浏览器客户端的数据存储
  • 原文地址:https://www.cnblogs.com/fuqian/p/16884758.html
Copyright © 2020-2023  润新知