您的位置:

首页 >

腾博会官网9888 >

腾博会官网9888:array_multisort实现PHP多维数组排序示例讲解 >

腾博会官网9888:array_multisort实现PHP多维数组排序示例讲解

2016-07-10 05:08:06

分类:腾博会官网9888

array_multisort — 对多个数组或多维数组进行排序 说明 bool array_multisort ( array ar1 [, mixed arg [, mixed ... [, array ...]]] ) array_multisort (PHP 4, PHP 5) 如果成功则返回 TRUE,失败则返回 FALSE。 array_multisort() 可以用来一次对多个数组进行排序,或者根据某一维或多维对多维数组进行排序。 关联(string)键名保持不变,但数字键名会被重新索引。 输入数组被当成一个表的列并以行来排序――这类似于 SQL 的 ORDER BY 子句的功能。第一个数组是要排序的主要数组。数组中的行(值)比较为相同的话就按照下一个输入数组中相应值的大小来排序,依此类推。 本函数的参数结构有些不同寻常,但是非常灵活。第一个参数必须是一个数组。接下来的每个参数可以是数组或者是下面列出的排序标志。 排序顺序标志: SORT_ASC – 按照上升顺序排序 SORT_DESC – 按照下降顺序排序 排序类型标志: SORT_REGULAR – 将项目按照通常方法比较 SORT_NUMERIC – 将项目按照数值比较 SORT_STRING – 将项目按照字符串比较 每个数组之后不能指定两个同类的排序标志。每个数组后指定的排序标志仅对该数组有效 – 在此之前为默认值 SORT_ASC 和 SORT_REGULAR。 例子 1. 对多个数组排序 <?php $ar1 = array(“10″, 100, 100, “a”); $ar2 = array(1, 3, “2″, 1); array_multisort($ar1, $ar2); var_dump($ar1); var_dump($ar2); ?> 本例中经过排序后,第一个数组将包含 “10″,”a”,100,100。第二个数组将包含 1,1,”2″,3。第二个数组中的项目顺序完全和第一个数组中相应的项目(100 和 100)顺序一致。 array(4) { [0]=> string(2) “10″ [1]=> string(1) “a” [2]=> int(100) [3]=> int(100) } array(4) { [0]=> int(1) [1]=> int(1) [2]=> string(1) “2″ [3]=> int(3) } 例子 2. 对多维数组排序 <?php $ar = array (array (“10″, 100, 100, “a”), array (1, 3, “2″, 1)); array_multisort ($ar[0], SORT_ASC, SORT_STRING, $ar[1], SORT_NUMERIC, SORT_DESC); ?> 本例中经过排序后,第一个数组将包含 10,100,100,”a”(作为字符串上升排序),第二个数组将包含 1,3,”2″,1(作为数值下降排序)。 例子 3. Sorting multi-dimensional array <?php $ar = array( array(“10″, 11, 100, 100, “a”), array( 1, 2, “2″, 3, 1) ); array_multisort($ar[0], SORT_ASC, SORT_STRING, $ar[1], SORT_NUMERIC, SORT_DESC); var_dump($ar); ?> 本例中在排序后,第一个数组将变成 “10″,100,100,11,”a”(被当作字符串以升序排列)。第二个数组将包含 1, 3, “2″, 2, 1(被当作数字以降序排列)。 array(2) { [0]=> array(5) { [0]=> string(2) “10″ [1]=> int(100) [2]=> int(100) [3]=> int(11) [4]=> string(1) “a” } [1]=> array(5) { [0]=> int(1) [1]=> int(3) [2]=> string(1) “2″ [3]=> int(2) [4]=> int(1) } } 例子 4. 对数据库结果进行排序 本例中 data 数组中的每个单元表示一个表中的一行。这是典型的数据库记录的数据集合。 例子中的数据如下: volume | edition ——-+——– 67 | 2 86 | 1 85 | 6 98 | 2 86 | 6 67 | 7 数据全都存放在名为 data 的数组中。这通常是通过循环从数据库取得的结果,例如 mysql_fetch_assoc()。 <?php $data[] = array(‘volume' => 67, ‘edition' => 2); $data[] = array(‘volume' => 86, ‘edition' => 1); $data[] = array(‘volume' => 85, ‘edition' => 6); $data[] = array(‘volume' => 98, ‘edition' => 2); $data[] = array(‘volume' => 86, ‘edition' => 6); $data[] = array(‘volume' => 67, ‘edition' => 7); ?> 本例中将把 volume 降序排列,把 edition 升序排列。 现在有了包含有行的数组,但是 array_multisort() 需要一个包含列的数组,因此用以下代码来取得列,然后排序。 <?php // 取得列的列表 foreach ($data as $key => $row) { $volume[$key] = $row['volume']; $edition[$key] = $row['edition']; } // 将数据根据 volume 降序排列,根据 edition 升序排列 // 把 $data 作为最后一个参数,以通用键排序 array_multisort($volume, SORT_DESC, $edition, SORT_ASC, $data); ?> 数据集合现在排好序了,结果如下: volume | edition ——-+——– 98 | 2 86 | 1 86 | 6 85 | 6 67 | 2 67 | 7 例子 5. 不区分大小写字母排序 SORT_STRING 和 SORT_REGULAR 都是区分大小写字母的,大写字母会排在小写字母之前。 要进行不区分大小写的排序,就要按照原数组的小写字母拷贝来排序。 <?php $array = array(‘Alpha', ‘atomic', ‘Beta', ‘bank'); $array_lowercase = array_map('strtolower', $array); array_multisort($array_lowercase, SORT_ASC, SORT_STRING, $array); print_r($array); ?> 上例将输出: Array ( [0] => Alpha [1] => atomic [2] => bank [3] => Beta ) 【译者注】本函数相当有用,为有助于理解,请再看下面这个例子: 例子 6. 名次排列 <?php $grade = array(“score” => array(70, 95, 70.0, 60, “70″), “name” => array(“Zhang San”, “Li Si”, “Wang Wu”, “Zhao Liu”, “Liu Qi”)); array_multisort($grade["score"], SORT_NUMERIC, SORT_DESC, // 将分数作为数值,由高到低排序 $grade["name"], SORT_STRING, SORT_ASC); // 将名字作为字符串,由小到大排序 var_dump($grade); ?> 上例将输出: array(2) { ["score"]=> array(5) { [0]=> int(95) [1]=> string(2) “70″ [2]=> float(70) [3]=> int(70) [4]=> int(60) } ["name"]=> array(5) { [0]=> string(5) “Li Si” [1]=> string(6) “Liu Qi” [2]=> string(7) “Wang Wu” [3]=> string(9) “Zhang San” [4]=> string(8) “Zhao Liu” } } 本例中对包含成绩的数组 $grade 按照分数(score)由高到低进行排序,分数相同的人则按照名字(name)由小到大排序。排序后李四 95 分为第一名,赵六 60 分为第五名没有异议。张三、王五和刘七都是 70 分,他们的名次则由其姓名的字母顺序排列,Liu 在前,Wang 在后而 Zhang 在最后。为了区别,三个 70 分分别用了整数,浮点数和字符串来表示,可以在程序输出中清楚地看到它们排序的结果。补充资料:对于PHP语言中的多维数组排序时最为复杂的一个排序方式。我们在实际编码中将会用到PHP函数array_multisort()来实现这一复杂的排序。例如,首先对一个嵌套数组使用一个普通的关键字进行排序,然后再根据另一个关键字进行排序。这与使用SQL的ORDER BY语句对多个字段进行排序非常相似。 PHP函数asort()利用值排序的具体方式解析 PHP函数arsort()的功能特点详解 PHP自然语言排序的特点介绍 PHP自然语言倒序的具体实现方式 如何运用PHP函数usort()实现自定义排序 Listing J示例为我们具体说明了PHP函数array_multisort()的工作方式: 1, "name" => "Boney M", "rating" => 3), array("id" => 2, "name" => "Take That", "rating" => 1), array("id" => 3, "name" => "The Killers", "rating" => 4), array("id" => 4, "name" => "Lusain", "rating" => 3), ); foreach ($data as $key => $value) { $name[$key] = $value[name]; $rating[$key] = $value[rating]; } array_multisort($rating, $name, $data); print_r($data);?> 这里,我们在$data数组中模拟了一个行和列数组。然后,我使用PHP函数array_multisort()对数据集合进行重排,首先是根据rating进行排序,然后,如果rating相等的话,再根据name排序。它的输出结果如下: 复制代码 代码如下: Array ([0] => Array ( [id] => 2 [name] => Take That [rating] => 1 ) [1] => Array ( [id] => 1 [name] => Boney M [rating] => 3 ) [2] => Array ( [id] => 4 [name] => Lusain [rating] => 3 ) [3] => Array ( [id] => 3 [name] => The Killers [rating] => 4 ) ) PHP函数array_multisort()是PHP中最有用的函数之一,它有非常广泛的应用范围。另外,就如你在例子中所看到的,它能对多个不相关的数组进行排序,也可以使用其中的一个元素作为下次排序的基础,还可以对数据库结果集进行排序。

开发需要,安装mantis(Mantis Bug Tracker,缺陷跟踪系统 缺陷管理平台),下的是最新版,官网地址是http://www.mantisbt.org/download.php .安装.并不是一帆风顺,而是相当坎坷.现总结下,方便以后用.(PS:最新版mantisbt-1.2.11)一、安装时遇到的问题1.Your database has not been created yet. Please create the database, then install the tables and data using the information above before proceeding.这就是说数据没能创建,得手动创,就是把前面显示一长串的sql语句运行下就好,当然里面的警告提示信息就不要复制了.个人的经验,是把create表和后面的alter表分开,因为很多时候,后面的语句没有执行,使用过程中就发现,很多查询都报unkown column这类的错,就是因为这个.2.config_inc.php 这个会提示没能创建,就是个php文件,写了连接数据库的一些配置.直接创建,把提示内容直接copy进去就好.3.安装结束后,移除admin整个文件,更改默认administrator的密码(推荐重建个管理,然后把administrator禁用),原因,你懂的.二、使用中遇到的问题1.函数时间问题,date()这类的函数,会提示不安全,然后,说已设置时区什么的.这个要在php.inc里面设置个默认时区就ok,一般我们是设置 Asia/Shanghai.2.中文显示,这个直接在mantis根目录下找config_defaults_inc.php在588行改成这样$g_default_language= 'chinese_simplified';3.database_version(这个是mantis_config_table数据没有被插入的原因,重新执行下就ok).4.点击查看分配(view.php?id=1)的时候,会报错,还是Unknown column 'user_id',mantis_bug_file_table这个表相关的alter的语句查看下,执行之(感觉有点扯蛋了,官方不会把sql语句整整好啥的).5.邮件配置,我用的smtp,这个配置是通用的(我用的是163)百度一下,你就知道.config_defaults_inc.php里面有相关的参数,只写正确就没有问题的.经过以前上几步,mantis就ok啦,接下来,尽情享受mantis来来的乐趣吧,

伪静态方法一: 复制代码 代码如下: <?php //伪静态方法一 // localhost/php100/test.php?id|[email protected]|2 $Php2Html_FileUrl = $_SERVER["REQUEST_URI"]; echo $Php2Html_FileUrl."<br>"; // /php100/test.php?id|[email protected]|2 $Php2Html_UrlString = str_replace("?","",str_replace("/", "", strrchr(strrchr($Php2Html_FileUrl, "/"),"?"))); echo $Php2Html_UrlString."<br>"; // id|[email protected]|2 $Php2Html_UrlQueryStrList = explode("@", $Php2Html_UrlString); print_r($Php2Html_UrlQueryStrList); // Array ( [0] => id|1 [1] => action|2 ) echo "<br>"; foreach($Php2Html_UrlQueryStrList as $Php2Html_UrlQueryStr) { $Php2Html_TmpArray = explode("|", $Php2Html_UrlQueryStr); print_r($Php2Html_TmpArray); // Array ( [0] => id [1] => 1 ) ; Array ( [0] => action [1] => 2 ) echo "<br>"; $_GET[$Php2Html_TmpArray[0]] = $Php2Html_TmpArray[1]; } //echo '假静态:$_GET变量<br />'; print_r($_GET); // Array ( [id|[email protected]|2] => [id] => 1 [action] => 2 ) echo "<br>"; echo "<hr>"; echo $_GET[id]."<br>"; // 1 echo $_GET[action]; // 2 ?> 复制代码 代码如下: 伪静态方法二: <?php //伪静态方法二 // localhost/php100/test.php/1/2 $filename = basename($_SERVER['SCRIPT_NAME']); echo $_SERVER['SCRIPT_NAME']."<br>";// /php100/test.php echo $filename."<br>";// test.php if(strtolower($filename)=='test.php'){ if(!empty($_GET[id])){ $id=intval($_GET[id]); echo $id."<br>"; $action=intval($_GET[action]); echo $action."<br>"; }else{ $nav=$_SERVER['REQUEST_URI']; echo "1:".$nav."<br>";// /php100/test.php/1/2 $script=$_SERVER['SCRIPT_NAME']; echo "2:".$script."<br>";// /php100/test.php $nav=ereg_replace("^$script","",urldecode($nav)); echo $nav."<br>"; // /1/2 $vars=explode("/",$nav); print_r($vars);// Array ( [0] => [1] => 1 [2] => 2 ) echo "<br>"; $id=intval($vars[1]); $action=intval($vars[2]); } echo $id.'&'.$action; } ?> 伪静态方法三: 复制代码 代码如下: <?php //伪静态方法三 function mod_rewrite(){ global $_GET; $nav=$_SERVER["REQUEST_URI"]; echo $nav."<br>"; $script_name=$_SERVER["SCRIPT_NAME"]; echo $script_name."<br>"; $nav=substr(ereg_replace("^$script_name","",urldecode($nav)),1); echo $nav."<br>"; $nav=preg_replace("/^.ht(m){1}(l){0,1}$/","",$nav);//这句是去掉尾部的.html或.htm echo $nav."<br>"; $vars = explode("/",$nav); print_r($vars); echo "<br>"; for($i=0;$i<Count($vars);$i+=2){ $_GET["$vars[$i]"]=$vars[$i+1]; } return $_GET; } mod_rewrite(); $year=$_GET["year"];//结果为'2006' echo $year."<br>"; $action=$_GET["action"];//结果为'_add' echo $action; ?> 伪静态方法四: 复制代码 代码如下: <?php //伪静态方法四 //利用server变量 取得PATH_INFO信息 该例中为 /1,100,8630.html 也就是执行脚本名后面的部分 if(@$path_info =$_SERVER["PATH_INFO"]){ //正则匹配一下参数 if(preg_match("/\/(\d+),(\d+),(\d+)\.html/si",$path_info,$arr_path)){ $gid=intval($arr_path[1]); //取得值 1 $sid=intval($arr_path[2]); //取得值100 $softid=intval($arr_path[3]); //取得值8630 }else die("Path:Error!"); //相当于soft.php?gid=1&sid=100&softid=8630 }else die('Path:Nothing!'); ?

php读取文件内容的五种方式分享下php读取文件内容的五种方法:好吧,写完后发现文件全部没有关闭。实际应用当中,请注意关闭 fclose($fp);--php读取文件内容:-----第一种方法-----fread()--------<?php$file_path = "test.txt";if(file_exists($file_path)){$fp = fopen($file_path,"r");$str = fread($fp,filesize($file_path));//指定读取大小,这里把整个文件内容读取出来echo $str = str_replace("\r\n","<br />",$str);}?>--------第二种方法------------<?php$file_path = "test.txt";if(file_exists($file_path)){$str = file_get_contents($file_path);//将整个文件内容读入到一个字符串中$str = str_replace("\r\n","<br />",$str);echo $str;}?>-----第三种方法------------<?php$file_path = "test.txt";if(file_exists($file_path)){$fp = fopen($file_path,"r");$str = "";$buffer = 1024;//每次读取 1024 字节while(!feof($fp)){//循环读取,直至读取完整个文件$str .= fread($fp,$buffer);} $str = str_replace("\r\n","<br />",$str);echo $str;}?>-------第四种方法--------------<?php$file_path = "test.txt";if(file_exists($file_path)){$file_arr = file($file_path);for($i=0;$i<count($file_arr);$i++){//逐行读取文件内容echo $file_arr[$i]."<br />";}/*foreach($file_arr as $value){echo $value."<br />";}*/}?>----第五种方法--------------------<?php$file_path = "test.txt";if(file_exists($file_path)){$fp = fopen($file_path,"r");$str ="";while(!feof($fp)){$str .= fgets($fp);//逐行读取。如果fgets不写length参数,默认是读取1k。}$str = str_replace("\r\n","<br />",$str);echo $str;}?>以上内容给大家分享了PHP读取文件内容的五种方式,希望大家喜欢。

诚然, 这个理由是对的, 不过, 我今天要说的, 是另外一个的原因.我们知道, PHP去判断一个文件是否被加载, 是需要得到这个文件的opened_path的, 意思是说, 比如:复制代码 代码如下:    <?php    set_include_path("/tmp/:/tmp2/");    include_once("2.php");    ?>当PHP看到include_once “2.php”的时候, 他并不知道这个文件的实际路径是什么, 也就无法从已加载的文件列表去判断是否已经加载, 所以在include_once的实现中, 会首先尝试解析这个文件的真实路径(对于普通文件这个解析仅仅类似是检查getcwd和文件路径, 所以如果是相对路径, 一般是不会成功), 如果解析成功, 则查找EG(include_files), 如果存在则说明包含过了, 返回, 否则open这个文件, 从而得到这个文件的opened_path. 比如上面的例子, 这个文件存在于 “/tmp2/2.php”.然后, 得到了这个opened_path以后, PHP去已加载的文件列表去查找, 是否已经包含, 如果没有包含, 那么就直接compile, 不再需要open file了.1. 尝试解析文件的绝对路径, 如果能解析成功, 则检查EG(included_files), 存在则返回, 不存在继续2. 打开文件, 得到文件的打开路径(opened path)3. 拿opened path去EG(included_files)查找, 是否存在, 如果存在则返回, 不存在继续4. 编译文件(compile_file)这个在大多数情况下, 不是问题, 然而问题出在当你使用APC的时候…在使用APC的时候, APC劫持了compile_file这个编译文件的指针, 从而直接从cache中得到编译结果, 避免了对实际文件的open, 避免了对open的system call.然而, 当你在代码中使用include_once的时候, 在compile_file之前, PHP已经尝试去open file了, 然后才进入被APC劫持的compile file中, 这样一来, 就会产生一次额外的open操作. 而APC正是为了解决这个问题, 引入了include_once_override, 在include_once_override开启的情况下, APC会劫持PHP的ZEND_INCLUDE_OR_EVAL opcode handler, 通过stat来确定文件的绝对路径, 然后如果发现没有被加载, 就改写opcode为include, 做一个tricky解决方案.但是, 很可惜, 如我所说, APC的include_once_override实现的一直不好, 会有一些未定义的问题, 比如:复制代码 代码如下:    <?php    set_include_path("/tmp");    function a($arg = array()) {        include_once("b.php");    }    a();    a();    ?>然后, 我们的b.php放置在”/tmp/b.php”, 内容如下:复制代码 代码如下:    <?php      class B {}    ?>那么在打开apc.include_once_override的情况下, 连续访问就会得到如下错误:Fatal error - include() : Cannot redeclare class排除这些技术因素, 我也一直认为, 我们应该使用include, 而不是include_once, 因为我们完全能做到自己规划, 一个文件只被加载一次. 还可以借助自动加载, 来做到这一点.你使用include_once,只能证明, 你对自己的代码没信心.所以, 建议大家,

焦点访谈

最新最热的文章

更多 >

COPYRIGHT (©) 2017 Copyright ©2017 腾博会官网 网站地图

联系我们

827570882

扫描二维码分享到微信