PHP数组函数排序的应用
如果你已经使用了一段时间PHP的话,那么,你应该已经对它的数组比较熟悉了——这种数据结构允许你在单个变量中存储多个值,并且可以把它们作为一个集合进行操作。
经常,开发人员发现在PHP中使用这种数据结构对值或者数组元素进行排序非常有用。PHP提供了一些适合多种数组的排序函数,这些函数允许你在数组内部对元素进行排列,也允许用很多不同的方法对它们进行重新排序。在这篇文章中我们将讨论该排序中最重要的几个函数。
简单排序
首先,让我们来看看最简单的情况:将一个数组元素从低到高进行简单排序,这个函数既可以按数字大小排列也可以按字母顺序排列。PHP的sort()函数实现了这个功能,如Listing A所示:
Listing A
<?php
$data = array(5,8,1,7,2);
sort($data);
print_r($data);
?>
输出结果如下所示:
Array ([0] => 1
[1] => 2
[2] => 5
[3] => 7
[4] => 8
)
也能使用rsort()函数进行排序,它的结果与前面所使用的sort()简单排序结果相反。Rsort()函数对数组元素进行从高到低的倒排,同样可以按数字大小排列也可以按字母顺序排列。Listing B给我们展示了它的一个例子:
Listing B
<?php $data = array(5,8,1,7,2);rsort($data); print_r($data);
?>
它的输出结果如下:
Array ([0] => 8
[1] => 7
[2] => 5
[3] => 2
[4] => 1
)
根据关键字排序
当我们使用数组的时候,经常根据关键字对数组重新排序,从高到低。Ksort()函数就是根据关键字进行排序的函数,同时,它在排序的过程中会保持关键字的相关性。Listing C就是一个例子:
Listing C
<?php $data = array("US" => "United States", "IN" => "India", "DE" => "Germany", "ES" => "Spain");ksort($data); print_r($data);
?>
它的输出结果如下:
Array ([DE] => Germany
[ES] => Spain
[IN] => India
[US] => United States
)
Krsort()函数是根据关键字对数组进行倒排,Listing D就是这样的例子:
Listing D
<?php $data = array("US" => "United States", "IN" => "India", "DE" => "Germany", "ES" => "Spain");krsort($data); print_r($data);
?>
它的输出结果如下:
Array ([US] => United States
[IN] => India
[ES] => Spain
[DE] => Germany
)
根据值排序
如果你想使用值排序来取代关键字排序的话,PHP也能满足你的要求。你只要使用asort()函数来代替先前提到的ksort()函数就可以了。如Listing E所示:
Listing E
<?php $data = array("US" => "United States", "IN" => "India", "DE" => "Germany", "ES" => "Spain");asort($data); print_r($data);
?>
下面就是它的输出结果。请注意这个结果与上面使用ksort()函数所得到的结果的不同——在这两种情况中,都是按字母顺序进行排序的,但是它们是根据数组的不同字段进行排序的。
同时,请注意关键字-值之间的联系会始终保持;它只是关键字-值对排序后的一种方式,排序并不会改变它们的对应关系。
Array ([DE] => Germany
[IN] => India
[ES] => Spain
[US] => United States
)
现在,你肯定能猜到这种排序也可以进行倒排,它使用arsort()函数完成这个功能。Listing F就是一个例子:
Listing F
<?php $data = array("US" => "United States", "IN" => "India", "DE" => "Germany", "ES" => "Spain");arsort($data); print_r($data);
?>
下面是它的输出结果,根据值按字母表顺序进行倒排。将下面的结果与用krsort()函数进行倒排后生成的结果进行比较,就能很容易明白两者的不同了。
Array ([US] => United States
[ES] => Spain
[IN] => India
[DE] => Germany
)
自然语言排序
PHP有一个非常独特的排序方式,这种方式使用认知而不是使用计算规则。这种特性称为自然语言排序,当创建模糊逻辑应用软件的时候这种排序方式非常有用。下面大家可以来看看它的一个简单例子,如Listing G所示:
Listing G
<?php $data = array("book-1", "book-10", "book-100", "book-5"); sort($data);print_r($data);
natsort($data); print_r($data);?>
它的输出结果如下:
Array ([0] => book-1
[1] => book-10
[2] => book-100
[3] => book-5
)
Array
(
[0] => book-1
[3] => book-5
[1] => book-10
[2] => book-100
)
它们的不同已经很清楚了:第二个排序结果更直观,更“人性化”,然而第一个则更符合算法规则,更具“计算机”特点。
自然语言能进行倒排吗?答案是肯定的!只要对natsort()的结果使用array_reverse()函数就可以了,Listing H就是一个简单例子:
Listing H
<?php $data = array("book-1", "book-10", "book-100", "book-5");natsort($data); print_r(array_reverse($data));
?>
下面是它的输出结果:
Array ([0] => book-100
[1] => book-10
[2] => book-5
[3] => book-1
)
根据用户自定义的规则排序
PHP也能让你定义自己的排序算法,你可以通过创建你自己的比较函数,并把它传递给usort()函数。如果第一个参数比第二个参数“小”的话,比较函数必须返回一个比0小的数,如果第一参数比第二个参数“大”的话,比较函数应该返回一个比0大的数。
Listing I就是这样的一个例子,在这个例子中根据它们的长度对数组元素进行排序,最短的项放在最前面:
Listing I
<?php $data = array("joe@host.com", "john.doe@gh.co.uk", "asmithsonian@us.info", "jay@zoo.tw");usort($data, 'sortByLen');
print_r($data); function sortByLen($a, $b) {
if (strlen($a) == strlen($b)) {
return 0;
} else {
return (strlen($a) > strlen($b)) ? 1 : -1;
}
}
?>
这样,就创建了我们自己的比较函数,这个函数使用strlen()函数比较每一个字符串的个数,然后分别返回1,0或-1.这个返回值是决定元素排列的基础。下面是它的输出结果:
Array ([0] => jay@zoo.tw
[1] => joe@host.com
[2] => john.doe@gh.co.uk
[3] => asmithsonian@us.info
)
自然语言排序
PHP有一个非常独特的排序方式,这种方式使用认知而不是使用计算规则。这种特性称为自然语言排序,当创建模糊逻辑应用软件的时候这种排序方式非常有用。下面大家可以来看看它的一个简单例子,如Listing G所示:
Listing G
<?php $data = array("book-1", "book-10", "book-100", "book-5"); sort($data);print_r($data);
natsort($data); print_r($data);?>
它的输出结果如下:
Array ([0] => book-1
[1] => book-10
[2] => book-100
[3] => book-5
)
Array
(
[0] => book-1
[3] => book-5
[1] => book-10
[2] => book-100
)
它们的不同已经很清楚了:第二个排序结果更直观,更“人性化”,然而第一个则更符合算法规则,更具“计算机”特点。
自然语言能进行倒排吗?答案是肯定的!只要对natsort()的结果使用array_reverse()函数就可以了,Listing H就是一个简单例子:
Listing H
<?php $data = array("book-1", "book-10", "book-100", "book-5");natsort($data); print_r(array_reverse($data));
?>
下面是它的输出结果:
Array ([0] => book-100
[1] => book-10
[2] => book-5
[3] => book-1
)
根据用户自定义的规则排序
PHP也能让你定义自己的排序算法,你可以通过创建你自己的比较函数,并把它传递给usort()函数。如果第一个参数比第二个参数“小”的话,比较函数必须返回一个比0小的数,如果第一参数比第二个参数“大”的话,比较函数应该返回一个比0大的数。
Listing I就是这样的一个例子,在这个例子中根据它们的长度对数组元素进行排序,最短的项放在最前面:
Listing I
<?php $data = array("joe@host.com", "john.doe@gh.co.uk", "asmithsonian@us.info", "jay@zoo.tw");usort($data, 'sortByLen');
print_r($data); function sortByLen($a, $b) {
if (strlen($a) == strlen($b)) {
return 0;
} else {
return (strlen($a) > strlen($b)) ? 1 : -1;
}
}
?>
这样,就创建了我们自己的比较函数,这个函数使用strlen()函数比较每一个字符串的个数,然后分别返回1,0或-1.这个返回值是决定元素排列的基础。下面是它的输出结果:
Array ([0] => jay@zoo.tw
[1] => joe@host.com
[2] => john.doe@gh.co.uk
[3] => asmithsonian@us.info
)
多维排序
最后,PHP也允许在多维数组上执行一些比较复杂的排序——例如,首先对一个嵌套数组使用一个普通的关键字进行排序,然后再根据另一个关键字进行排序。这与使用SQL的ORDER BY语句对多个字段进行排序非常相似。为了能更好的明白它是如何工作的,请仔细看Listing J所举的例子:
Listing J
<?php $data = array(array("id" => 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数组中模拟了一个行和列数组。然后,我使用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
)
)
array_multisort()函数是PHP中最有用的函数之一,它有非常广泛的应用范围。另外,就如你在例子中所看到的,它能对多个不相关的数组进行排序,也可以使用其中的一个元素作为下次排序的基础,还可以对数据库结果集进行排序。
这些例子应该让你对PHP中各种数组排序函数的使用有了初步的了解,也向你展示了一些隐藏在PHP数组处理工具包的内部功能。
批量下载CSS文件中的图片
2.如果CSS里面图片写的是相对路径,那么还要把 ../images 全部替换成图片的绝对路径,例如: http://www.aaa.com/images。
3.将 ) 全部替换成 > ,然后保存。
4.将CSS文件后缀名改成.html。
5.打开改名后的CSS文件,在页面中点击右键,选用使用网际快车或者迅雷下载全部链接。
6.然后这些下载工具就会替我们把所有的图片全部下载过来,听着那美妙的叮叮声,真是感觉无比幸福啊。
转:一个卖"黄碟"给一个女孩的老板经历
昨天在家里上网看新闻,突然蹦出个网页很黄很暴力,我连忙关了新闻看这个网页,不看不知道看了吓一跳,原来都是明星裸照。老实说我还是第一次这么真实的看到明星们脱光衣服的样子,原来哪玩意也和我们一样,都挺难看,女的身材甚至比不上我女友的妈妈。我很失望,心里非常伤心,我心中高尚纯洁的女神们啊你们为什么这样表里不一。一夜难眠。。。。今早我无精打彩怀着郁闷的心情到电脑城上班,刚上班就有一个挺靓的年轻小女生来买东西。她问我:有全黄的碟吗?? 我惊呆了!真的惊呆了!我足足目不转睛的盯着她看了5秒钟,说实话自我从事这个行业以来还没有过有女孩子跟我买黄碟的!我吞吞吐吐的回答她:"有....什么黄碟都有...."小女生这时候显得似乎非常老练,她沉稳的说:"那就都拿来看看先."我迟疑了一下,还是从柜台下面拿出装满黄碟的黑色塑料袋递给她,她好像嫌在口袋里翻太麻烦,就抓出一大把,一张一张的翻看,看了好一会儿,不知为什么慢慢的脸色有点变红,而这个时候周围的好几个男的正跟看外星人似的看着她..........突然她猛一扬头提高声音对我吼道: "我是要全黄的碟。"我很肯定的对她点了点头:"对,这些都是全黄的。" “我是说有好多人,各个国家的都有,能打架的...."她做出要哭的样子,好像对她手里的哪些碟口味太轻不是很满意。
";欧美SM的在下面,你自己找找,兽交的也有" 我连忙向她解释说。
"...." 她好象想说什么,嘴唇动了一下,但最终没有说出来.........
她突然目露凶光转身就跑,手里稳稳抓着我的黄碟,在围观群众的目光中嗖的一下就冲出了电脑城。等我反应过来丫已经在100米开外了,我大声喊:来人啊,抓小偷啊,有人抢劫啊。但为时已晚,我刚听到自己的回声,她已经彻底从我眼前消失。我很伤心,心里非常愤怒,我心中贤淑纯美可爱的女人们啊,你们何时变得如此黄且还暴力了呢!这是为什么呢?
转:一个女孩买‘黄碟’的经历
昨天在哥哥家里看见哥哥玩一个很老的电脑游戏,人物都挺帅的.他告诉我游戏的名字叫拳皇.今天经过电脑城的时候,顺便想买张碟子回家玩.卖碟的老板是年轻的小男生,还挺帅的,我问:有拳皇(全黄)的碟吗??那个卖碟的男生呆呆的看了我足有5秒钟,吞吞吐吐的回答:"有....什么黄碟都有...."我还以为他是说拳皇的碟有很多版本,他这里什么都有,我就说:"那就都拿来看看先."他迟疑了一下,还是从柜台下面拿出个黑色的塑料口袋递给我,我嫌在口袋里翻太麻烦,就抓出一大把,一张一张的翻看,看了好一会儿才发现不对劲,而这个时候周围的好几个男的正跟看外星似的看着我..........真羞的想找个地缝钻进去.为了挽回点面子,我赶紧提高的了声音对着卖碟的更正道:
"我是要拳皇的碟";
那个老板很肯定的点了点头:"对,这些都是全黄的"
....";我是说有好多人,各个国家的都有,能打架的...."
";欧美SM的在下面,你自己找找"
"...."
我还想组织语言解除误会,却尴尬的一句话都说不出来.........
在周围人的目光中,我逃似的跑出电脑城,身后卖碟的老板还在叫我,我理都不理,直到跑出好远我才发现,我手里还抓着一把没付钱的"拳皇"碟.........
转义字符 意义 ASCII码值(十进制)
\a 响铃(BEL) 007
\b 退格(BS) 008
\f 换页(FF) 012
\n 换行(LF) 010
\r 回车(CR) 013
\t 水平制表(HT) 009
\v 垂直制表(VT) 011
\\ 反斜杠 092
\? 问号字符 063
\' 单引号字符 039
\" 双引号字符 034
\0 空字符(NULL) 000
\ddd 任意字符 三位八进制
\xhh 任意字符 二位十六进制
字符型常量
字符型常量所表示的值是字符型变量所能包含的值。我们可以用ASCII表达式来表示一个字符型常量,或者用单引号内加反斜杠表示转义字符。
'A', '\x2f', '\013';
其中:\x表示后面的字符是十六进制数,\0表示后面的字符是八进制数。
注意:在Turbo C 2.0中,字符型常量表示数的范围是-128到127,除非你把它声明为unsigned,这样就是0到255。
上面我们见到的\x,\n,\a等等都是叫转义字符,它告诉编译器需要用特殊的方式进行处理。下面给出所有的转义字符和所对应的意义:
转义字符 描述
\' 单引号
\ 双引号
\\ 反斜杠
\0 空字符
\0nnn 八进制数
\a 声音符
\b 退格符
\f 换页符
\n 换行符
\r 回车符
\t 水平制表符
\v 垂直制表符
\x 十六进制符