PageRank-网页排序算法

包括谷歌在内,多数搜索引擎都是不断地运行计算机程序群,来检索网络上的网页、搜索每份文件中的词语并且将相关信息以高效的形式进行存储。每当用户检索一个短语,例如“搜索引擎”,搜索引擎就将找出所有含有被检索短语的网页。(或许,类似“搜索”与“引擎”之间的距离这样的额外信息都被会考虑在内。)

但问题是,谷歌现在需要检索250亿个页面,而这些页面上大约95%的文本仅由大约一万个单词组成。也就是说,对于大多数搜索而言,将会有超级多的网页含有搜索短语中的单词。我们所需要的其实是这样一种办法(或称算法),它能够将这些符合搜索条件的网页按照重要程度进行排序,这样才能够 将最重要的页面排在最上面 。

本文将介绍谷歌的网页排序算法(PageRank Algorithm),以及它如何从250亿份网页中捞到与你的搜索条件匹配的结果。它的匹配效果如此之好,以至于“谷歌”(google)今天已经成为一个被广泛使用的动词了。

如何辨别谁重要

如果你曾建立过一个网页,你应该会列入一些你感兴趣的链接,它们很容易使你点击到其它含有重要、可靠信息的网页。这样就相当于你肯定了你所链接页面的重要性。谷歌的网页排序算法每月在所有网页中进行一次受欢迎程度的评估,以确定哪些网页最重要。网页排序算法的提出者,谢尔盖?布林(Sergey Brin)和拉里?佩奇(Lawrence Page)的基本想法是: 一个网页的重要性是由链接到它的其他网页的数量及其重要性来决定。

我们对任意一个网页P,以I(P)来表述其重要性,并称之为网页的网页排序。在很多网站,你可以找到一个近似的网页排序值。(例如,美国数学会的首页目前的网页排序值为8,最高分是10。你可以试试找到一个网页排序值为10的网页吗?)这个网页排序值仅是一个近似值,因为谷歌拒绝提供真实的网页排序值,以阻止那些试图干扰排序的行为。

网页排序是这样确定的。假定网页Pj有lj个链接。如果这些链接中的一个链接到网页Pi,那么网页Pj将会将其重要性的1/lj赋给Pi。 网页Pi的重要性就是所有指向这个网页的其他网页所贡献的重要性的加和。 换言之,如果我们记链接到网页Pi的网页集合为Bi,那么

a7694516db7c446a885ce3b139b8b368

这或许让你想起“先有鸡还是先有蛋”的问题:为了确定一个网页的重要性,我们首先得知道所有指向它的其他网页的重要性。然而,我们可将这个问题改写为一个更数学化的问题。

首先建立一个矩阵,称为超链矩阵(hyperlink matrix),H=[Hij],其中第i行第j列的元素为

5af810897dfb4a8e8139b61c47a2e4d4

注意到H有一些特殊的性质。首先,它所有的元都是非负的。其次,除非对应这一列的网页没有任何链接,它的每一列的和为1。所有元均非负且列和为1的矩阵称为随机矩阵,随机矩阵将在下述内容中起到重要作用。

我们还需要定义向量I=[I(Pi)],它的元素为所有网页的网页排序—— 重要性的排序值 。前面定义的网页排序可以表述为

换言之,向量I是矩阵H对应特征值1的特征向量。我们也称之为矩阵H的平稳向量(stationary vector)。

让我们来看一个例子。下图所示为一个网页集合(8个),箭头表示链接。

b0a1933c99b7447b91579b9287b552ea

其相应的矩阵为

bb5f54dc62104bafbe7e4739f946d599

这说明网页8的受欢迎程度最高。下图是阴影化的图,其中网页排序值越高的网页阴影越浅。

0a49d1e6f6e44e5aa2fd82ed4dcc6a72

计算平稳向量

有很多方法可以找到一个方阵的特征向量。然而,我们面对的是一个特殊的挑战,因为矩阵H是一个这样的方阵,它的每一列都对应谷歌检索到的一个网页。也就是说,H大约有n=250亿行和列。不过其中大多数的元都是0;事实上,研究表明每个网页平均约有10个链接,换言之,平均而言,每一列中除了10个元外全是0。我们将选择被称为幂法(power method)的方法来找到矩阵H的平稳向量 I。

幂法如何实现呢?首先选择 I 的备选向量I0,进而按下式产生向量序列 Ik

56893994229e4d4f8ba62122c2b094d0

这个方法是建立在如下的一般原理上:

一般原理:序列Ik将收敛到平稳向量I。

我们首先用个例子验证上面的结论。

474885f79e064a67b57694d0b396ce74

一个自然的问题是,这些数字有什么含义。当然,关于一个网页的重要性,可能没有绝对的度量,而仅有比较两个网页的重要性的比例度量,如“网页A的重要性是网页B的两倍。”基于这一原因,我们可以用一个固定量去同乘以所有的重要性排序值,这并不会影响我们能获得的信息。这样,我们总是假定所有受欢迎程度值(popularity)的和为1,原因稍后解释。

三个重要的问题

自然而然产生的三个问题是:

序列Ik总是收敛吗?(即运算多次后,Ik和Ik+1几乎是一样的)

收敛后的平稳向量是否和初始向量I0的选取没有关系?

重要性排序值是否包含了我们想要的信息?

对目前的方法而言,上述三个的答案都是否定的!下面,我们将看看如何改进我们的方法,使得改进后的算法满足上述三个要求。 先看个非常简单的例子。考虑如下包含两个网页的小网络,其中一个链接到另一个:

4ce6b4b19c9d44baa1e1d51479352be1

下例展示了算法的运行过程:

24c8696f593243f587206df3930560f2

在这个例子中,两个网页的重要性排序值均为0,这样我们无法获知两个网页之间的相对重要性信息。问题在于网页P2没有任何链接。因此,在每个迭代步骤中,它从网页P1获取了一些重要性,但却没有赋给其他任何网页。这样将耗尽网络中的所有重要性。没有任何链接的网页称为悬挂点(dangling nodes),显然在我们要研究的实际网络中存在很多这样的点。稍后我们将看到如何处理这样的点,在此之前我们先考虑一种新的理解矩阵H和平稳向量I的思路。

H的概率化解释

想象我们随机地在网上跳转网页;也就是说,当我们访问一个网页时,一秒钟后我们随机地选择当前网页的一个链接到达另一个网页。例如,我们正访问含有lj个链接的网页Pj,其中一个链接引导我们访问了网页Pi,那么下一步转到网页Pi的概率就是1/lj。

由于跳转网页是随机的,我们用Tj表示停留在网页Pj上的时间。那么我们从网页Pj转到网页Pi的时间为Tj/lj。如果我们转到了网页Pi,那么我们必然是从一个指向它的网页而来。这意味着

9c358c02c69a403d8b83029a7d002534

其中求和是对所有链接到Pi的网页Pj进行的。注意到这个方程与定义网页排序值的方程相同,因此I(Pi)=Ti。那么一个网页的网页排序值可以解释为随机跳转时花在这个网页上的时间。如果你曾经上网浏览过某个你不熟悉的话题的相关信息时,你会有这种感觉:按照链接跳转网页,过一会你会发现,相较于其他网页,你会更频繁地回到某一部分网页。正如谚语所说“条条大路通罗马,”这部分网页显然是 更重要的网页 。

基于这个解释,很自然地可以要求 网页排序向量I的所有元之和为1 。

当然,这种表述中还存在一个问题:如果我们随机地跳转网页,在某种程度上,我们肯定会被困在某个悬挂点上,这个网页没有给出任何链接。为了能够继续进行,我们需要随机地选取下一个网页;也就是说,我们假定悬挂点可以链接到其他任何一个网页。这个效果相当于将超链矩阵H做如下修正:将其中所有元都为0的列替换为所有元均为1/n的列,前者就对应于网页中的悬挂点。这样修正后悬挂点就不存在了。我们称修正后的新矩阵为S。

我们之前的例子,现在就变成了

513c08486d3442aab58d2ac6c134e70e

换言之,网页P2的重要性是网页P1的两倍,符合你的直观认知了。

矩阵S有一个很好的性质,即其所有元均非负且每列的和均为1。换言之,S为随机矩阵。随机矩阵具有一些很有用的性质。例如,随机矩阵总是存在平稳向量。

为了稍后的应用,我们要注意到S是由H通过一个简单的修正得到。定义矩阵A如下:对应于悬挂点的列的每个元均为1/n,其余各元均为0。则S=H+A。

幂法如何实现?

一般而言,幂法是寻找矩阵对应于绝对值最大的特征值的特征向量。就我们而言,我们要寻找矩阵S对应于特征值1的特征向量。首先要说到的是最好的情形。在这种情形下,其他特征值的绝对值都小于1;也就是说,矩阵S的其它特征值都满足 λ <>

我们假定矩阵S的特征值为λj,且

0bb0ca33f394497398560c234dfb8769

对矩阵S,假设对应于特征值λj的特征向量存在一个基向量vj。这一假设在一般情况下并不一定要成立,但如果成立可以帮助我们更容易地理解幂法如何实现。将初始向量I0写成如下形式

be72029612fe45fa832edfc0f267a742

那么

c5b01d4cd84a4ca1905d8b9ebb4c1981

当j≥2时,因为所有特征值的绝对值小于1,因此这是λkj→0。从而Ik→I=c1v1,后者是对应于特征值1的一个特征向量。 需要指出的是,Ik→I的速度由 λ2 确定。当 λ2 比较接近于0时,那么λk2→0会相当快。例如,考虑下述矩阵

2bd81618be404882891c87b0f6496625

这个矩阵的特征值为λ1=1及λ2=0.3。下图左可以看出用红色标记的向量Ik收敛到用绿色标记的平稳向量I。

8ac01223ff5741f5b595d40475ef82aa

再考虑矩阵

faf6e315b828482fbc4a40031dfdf98c

其特征值为λ1=1及λ2=0.7。从上图右可以看出,本例中向量Ik收敛到平稳向量I的速度要慢很多,因为它的第二个特征值较大。

不顺之时

在上述讨论中,我们假定矩阵S需要满足λ1=1且 λ2 <>

假定网络关系如下:

8a01ce279d6949639f9cb5d4884a648f

在这种情形下,矩阵S为

d74f511dcc504c81a100cda14df94105

那么我们可以得到

f6d5e4cc501446559ae7ee6b5d0c6b9e

在这种情况下,向量序列Ik不再收敛。这是为什么?注意到矩阵S的第二个特征值满足 λ2 =1,因此前述幂法的前提不再成立。

为了保证 λ2 <><>

下面说明我们的方法行不通的另一个例子。考虑如下图所示的网络

1c56142a91ba4a9491e75099dea3cc8e

在此例中,矩阵S为

47740f3c940a4c11939e3fdf8a900b17

注意到前四个网页的网页排序值均为0。这使我们感觉不太对:每个页面都有其它网页链接到它,显然总有人喜欢这些网页!一般来说,我们希望所有网页的重要性排序值均为正。这个例子的问题在于,它包含了一个小网络,即下图中蓝色方框部分。

7ba7fa0a26b04c08805158984a71acf9

在这个方框中,有链接进入到蓝色方框,但没有链接转到外部。正如前述中关于悬挂点的例子一样,这些网页构成了一个“重要性水槽”,其他四个网页的重要性都被“排”到这个“水槽”中。这种情形发生在矩阵S为可约(reducible)时;也即,S可以写成如下的块形式

7e6d2ab9bdcd404c84aadbb90ff94a76

实际上,我们可以证明:如果矩阵S不可约,则一定存在一个所有元均为正的平稳向量。

对一个网络,如果任意给定两个网页,一定存在一条由链接构成的路使得我们可以从第一个网页转到第二个网页,那么称这个网络是强连通的(strongly connected)。显然,上面最后的这个例子不是强连通的。而强连通的网络对应的矩阵S是不可约的。

简言之,矩阵S是随机矩阵,即意味着它有一个平稳向量。然而,我们同时还需要S满足(a)本原,从而 λ2 <>

最后一个修正

为得到一个本原且不可约的矩阵,我们将修正随机跳转网页的方式。就目前来看,我们的随机跳转模式由矩阵S确定:或者是从当前网页上的链接中选择一个,或者是对没有任何链接的网页,随机地选取其他网页中的任意一个。为了做出修正,首先选择一个介于0到1之间的参数α。然后假定随机跳转的方式略作变动。具体是,遵循矩阵S的方式跳转的概率为α,而随机地选择下一个页面的概率是1?α。

若记所有元均为1的n×n矩阵为J,那么我们就可以得到谷歌矩阵(Google matrix):

11a45e859c424e9aa8b7e0fbdd7d390c

注意到G为随机矩阵,因为它是随机矩阵的组合。进而,矩阵G的所有元均为正,因此G为本原且不可约。从而,G存在唯一的平稳向量I,后者可以通过幂法获得。

参数α的作用是一个重要因素。若α=1,则G=S。这意味着我们面对的是原始的网络超链结构。然而,若α=0,则G=1/nJ。也即我们面对的是一个任意两个网页之间都有连接的网络,它已经丧失了原始的网络超链结构。显然,我们将会把α的值取得接近于1,从而保证网络的超链结构在计算中的权重更大。

然而,还有另外一个问题。请记住,幂法的收敛速度是由第二个特征值的幅值 λ2 决定的。而对谷歌矩阵,已经证明了第二个特征值的幅值为 λ2 =α。这意味着当α接近于1时,幂法的收敛速度将会很慢。作为这个矛盾的折中方案,网页排序算法的提出者谢尔盖?布林和拉里?佩奇选择α=0.85。

计算排序向量 I

到目前为止,我们所讨论的看起来是一个很棒的理论,然而要知道,我们需要将这个方法应用到一个维数n约为250亿的n×n矩阵!事实上,幂法特别适用于这种情形。

回想随机矩阵S可以写成下述形式

6892cb250cac44b48619595af60afda1

从而谷歌矩阵有如下形式

1064321af0d74ead8bb219ea0e34892f

其中J是元素全为1的矩阵,从而

3b38852bf71c4ae2a2bf7855d67bd712

现在注意到,矩阵H的绝大部分元都是0;平均而言,一列中只有10个元是非零数。从而,求HIk的每个元时,只需要知道10个项即可。而且,和矩阵J一样,矩阵A的行元素都是相同的。从而,求AIk与JIk相当于添加悬挂点或者所有网页的当前重要性排序值。而这只需要一次即可完成。

当α取值接近于0.85,布林和佩奇指出,需要50到100次迭代来获得对向量I的一个足够好的近似。计算到这个最优值需要几天才能完成。

当然,网络是不断变化的。首先,网页的内容,尤其是新闻内容,变动频繁。其次,网络的隐含超链结构在网页或链接被加入或被删除时也要相应变动。有传闻说,谷歌大约1个月就要重新计算一次网页排序向量I。由于在此期间可以看到网页排序值会有一个明显的波动,一些人便将其称为谷歌舞会(Google Dance)。(在2002年,谷歌举办了一次谷歌舞会!)

总结

布林和佩奇在1998年创建了谷歌,正值网络的增长步伐已经超过当时搜索引擎的能力范围。在那个时代,大多数的搜索引擎都是由那些没兴趣发布其产品运作细节的企业研发的。在发展谷歌的过程中,布林和佩奇希望“推动学术领域更多的发展和认识。”换言之,他们首先希望,将搜索引擎引入一个更开放的、更学术化的环境,来改进搜索引擎的设计。其次,他们感到其搜索引擎产生的统计数据能够为学术研究提供很多的有趣信息。看来,联邦政府最近试图获得谷歌的一些统计数据,也是同样的想法。

还有一些其他使用网络的超链结构来进行网页排序的算法。值得一提的例子是HITS算法,由乔恩·克莱因伯格(Jon Kleinberg)提出,它是Teoma搜索引擎的基础。事实上,一个有意思的事情是比较一下不同搜索引擎获得的搜索结果,这也可以帮助我们理解为什么有人会抱怨谷歌寡头(Googleopoly)。

新手如何学习Java——Java学习路线图

怎么学习Java,这是很多新手经常会问我的问题,现在我简单描述下一个Java初学者到就业要学到的一些东西:

首先要明白Java体系设计到得三个方面:J2SE,J2EE,J2ME(KJAVA)。J2SE,Java 2 Platform Standard Edition,我们经常说到的JDK,就主要指的这个,它是三者的基础,属于桌面级应用开发,这部分如果学得好很容易拓展J2EE和J2ME。J2ME,The Micro Edition of the java 2 Platform。主要用于嵌入式Java,如手机,PDA等等。J2EE,Java 2 Platform,Enterprise Edition,就是所谓的企业级Java,适合企业的大型应用开发。

J2SE:

新手最初学习的时候先要从J2SE开始学起,所包含的内容主要分为:面向对象概念的理解、Java基本语法的学习,Java桌面图形界面应用程序的开发,掌握常用的Java API等(关键是要学会怎样查阅)。

重点:Java基本语法(循环结构,数据类型,数组,运算符等)、Swing,awt,事件机制、文件输入输出流处理等

难点:面向对象思想的理解(接口、类等)、线程、socket网络编程等

视频教程推荐:孙鑫的Java基础视频教程、张孝祥的Java基础视频教程,讲的都很细,而且这两位老师在教学方面都有很好的经验。

J2EE:

在学习了J2SE之后,你可以尝试着慢慢过渡到J2EE,当然,学习J2EE海需要很多非JAVA技术的支撑,比如数据库技术,网页编程技术等等,待会我会详细介绍这两方面的内容。J2EE有三个必学的框架,如果你说你学了J2EE,但又不会这三个框架的话,那会让人笑掉大牙,这三个框架分别是Struts、spring和hibernate,虽然这三个框架应用很广,但不代表这三个框架就代表了J2EE,J2EE还有很多其他的东西,比如EJB,作为一款重量级(此重量级不是指重量级选手那个意思,此重量级非彼重量级)框架,虽然这个应用慢慢的再被其他框架所取代,但EJB3.0的出现也给它带回一些生机,作为一个分布式应用的框架,也是大家要去学习和了解的知识。

当然,刚才说到J2EE包含的范围很广,即使我把我所了解的所有技术说出来,也并不能代表J2EE,这是一个很深很广的学问,需要大家以后再工作的时候慢慢去发现了。我所了解的还包括:

JDBC:Java数据库连接对象,基础中的基础,Hibernate也只是对它的封装而已 JNDI: Java 命名与目录接口,J2EE重要规范之一

EJBS: 上面已经提到过了

RMI: 提供远程调用方法的支持,主要用于程序分布式开发

JMS: Java消息服务,中间件技术

JAVA IDL: 提供J2EE平台与CORBA交互能力和互联能力的技术

JTS: 组件事务监视器

JTA: 事务划分的一个技术

JAVAMAIL: Java中的邮件技术

JAF: Java启动框架,没研究过

Log4j,一款日志处理的框架应用

Junit:单元测试的好帮手

freemarker、velocity:两款不错的模板引擎

与Flash的交互Flex:目前很多的SNS应用就是使用到了这个技术

Web services:想知道我们论坛天气预报的效果是怎么做的吗?请关注这个技术 SOA:面向服务架构,未来技术发展的趋势之一

Java学习交流QQ群:589809992 我们一起学Java!
……

不过前面介绍到得这些都不是J2EE的基础,是属于框架应用级别的.要真正把上面说到的知识掌握好,还是的学习J2EE最核心的东西:JDBC、JSP、servlet和JavaBean,后面三个也是学习SSH的基础(Struts\Spring\Hibernate的简称).鉴于J2EE的内容太过复杂,建议大家最初只学习: JSP,servlet和JavaBean,等这个基础掌握好再把SSH学习了,再对其他J2EE技术有个大致的了解就可以出去找工作了。当然,找工作的前提除了把Java学习好,还会有一些其他的技术也是必须要掌握的。

-_- 我很简单,Java却要求我学这么多复杂的东西。除了这些技术的东西,在这阶段,大家更多的是会接触到比如设计模式的东西,比如工厂模式、桥梁模式、单例模式等等,还要学习建模思想(比如UML建模等等)和软件生命周期等等。这些是升华大家编程思想的手段和途径。

数据库技术:

数据库几乎是程序中不可或缺的一部分,在整个软件开发中更是占据了重要作用.数据库在整个软件中扮演的是地基的角色,你要修房子,就要先打好地基,你要做软件,就要先设计好的数据库.目前数据库几乎都是关系型数据库,代表的有: SQL Server/MySQL—不建议学这个没有多大意义。

Oracle.甲骨文公司的产品,大型数据库,正版的一般公司买不起.只有看看了,不过现在Java开发60%都是会使用到这个数据库,再加上现在甲骨文已经把sun公司收购了,JAVA和oracle得关系更加暧昧,各位得多花些时间在这上面了.

除了这些,你还应该了解一些桌面应用软件开发用到的数据库,比如说sqlite。你在制作安装程序的时候可以把这个数据库打包进你的安装程序。

网页编程基础:

网页编程基础要学的内容也比较多,但主要集中在以下这三个技术之上,大家每天看的各种样式的网页都是它们呈现的:

HTML:超文本标记语言

CSS:层叠样式表

JavaScript:浏览器客户端脚本语言

现在更是流行各种javascript库,比如:jQuery、ExtJs等,你要是会其中的某一个库的使用,找工作so easy。

J2ME:

如果你在学习了以上技术还不过瘾,可以再学习手机程序的开发,就我个人看来,开发手机程序技术其实蛮简单的,难点在于优化,比如怎么让你写的程序尽量的节约手机资源,“代码诚可贵,手机价更高“,所以不得不比PC机多考虑很多成本和实用性问题。J2ME的学习的话,切忌不要单纯的再模拟器上测试,一定要找真机测试,真机和模拟器的效果之间差别是很大的。更多手机开发技术,有兴趣的朋友可以和我一起探讨。

开发工具:

开发工具的选择主要还是看大家的习惯,我个人比较喜欢使用eclispe,功能很强大,也很好拓展其他的功能。当让初学你也可以选择JCreator,或者最好就直接用记事本。等你熟悉了Java代码之后,就可以使用JBuilder、eclispe或者netbeans这一类的工具了。

本文转发自:http://geek.csdn.net/news/detail/238782   作者:CSDN邓帅

9款惊艳的HTML5/CSS3动画应用赏析

Web开发的未来必定是让网页更加的多样化,更加绚丽多彩,用户交互更加方便。HTML5的应用正好可以达到这一要求,本文主要分享了9个基于HTML5和CSS3的动画应用,效果相当惊艳,一起来看看吧。

1、HTML5 Canvas实现会跳舞的时间动画

这是一款很有意思的HTML5 Canvas时间动画,总体来说,它是一个可以和客户端同步的时钟,其特点是当时间走动时,数字将会散落成一个个粒子动画,这种HTML5 Canvas动画在之前也有分享过,比如这个HTML5粒子文字特效

html5-canvas-dance-time

在线演示 / 源码下载

2、HTML5 SVG绘制的纸鹤动画 带颜色渐变效果

前面我们分享过一款基于HTML5和SVG的创意开关切换按钮,比较实用。这次要带来的这款HTML5应用也是基于SVG的,是一只雄伟的纸鹤,并且纸鹤的皮肤颜色会不断地发生变化,动画效果非常不错,小编认为,如果纸鹤能动起来那就更加完美了,期待您去完善它。

html5-svg-firebird

在线演示 / 源码下载

3、HTML5 Canvas炫酷的火焰风暴动画

利用HTML5技术,我们已经实现过不少关于火焰动画特效的HTML5应用,尤其是和Canvas搭配,比如HTML5动感的火焰燃烧动画特效HTML5 Canvas火焰喷射动画效果。这次给大家带来的是一款基于HTML5 Canvas的火焰风暴动画特效,改动画效果就像从天上掉落火焰一样,火焰风暴逐渐蔓延到整一个画布。

html5-canvas-firestorm

在线演示 / 源码下载

4、HTML5五彩连珠小游戏

之前我们分享过很多炫酷的HTML5游戏,比如HTML5堆木头游戏,实现原理也是比较简单的。今天我们要分享另外一款HTML5小游戏,名字叫五彩连珠。点击彩球移动到期望的位置,每移动一次,画面将随机出现3个新的彩球;当同一颜色的彩球连成5个一行或一列或一斜线时,这5个彩球同时消失,游戏得分10分。当画面上每个方格都被彩球占满时,游戏结束。

html5-color-game

在线演示 / 源码下载

5、CSS3音量调节旋转按钮

之前我们分享过很多可以调节音量的HTML5视频播放器,大部分音量调节按钮都比较普通,没有什么特色。今天要分享一款基于CSS3的音量调节旋转按钮,只要按住鼠标即可旋转按钮来调节音量。这是一款很有特色旋转按钮。

css3-rotate-buttons

在线演示 / 源码下载

6、纯CSS3实现超酷的磁带动画

记得之前分享过一款HTML5磁带式古典播放器,效果相当震撼。这次我们要用纯CSS3来实现一个超酷的磁带动画特效。首先用纯CSS3绘制了一个磁带的外观,还是相当逼真的,然后用CSS3的动画属性实现了磁带的旋转,就像在播放歌曲一样,如果配合HTML5的音频播放功能,就和那个磁带播放器差不多了。

css3-cassette-tape

在线演示 / 源码下载

7、HTML5仿Apple Watch时钟动画

Apple Watch刚刚发布不久,就已经有国外的大牛将其时钟表盘界面用HTML5模仿出来了,并且这款HTML5仿Apple Watch的时钟是动态的,可以根据本地时间实时更新指针数据。时钟的界面非常华丽,确实有苹果的风格,HTML5也的确非常强大。

html5-apple-watch

在线演示 / 源码下载

8、CSS3 3D镂空文字特效

之前我们有分享过一款镂空效果的CSS3按钮,镂空部分可以定义其他的背景图片。今天我们要介绍的也是一款基于CSS3的镂空文字特效,这样的镂空文字效果在以前很难实现,必须使用背景图片,但是现在利用CSS3,这种镂空效果变得非常简单。

css3-3d-stroke-text

在线演示 / 源码下载

9、jQuery/CSS3实现网页元素抖动特效

今天我们要来分享一款很酷的jQuery/CSS3动画特效,它可以让网页中的元素进行抖动,抖动的参数也可以自定义设置。可以定义抖动的快慢、方向以及更为复杂的抖动效果。改应用基于jQuery和CSS3实现,实现起来也比较方便。

jquery-css3-shake

在线演示 / 源码下载

以上内容转发自:http://www.html5tricks.com/9-amazing-html5-cssanimation.html

PHP数组操作函数

常用PHP数组操作函数如下:

ssort()  //根据数组关联性排序
ksort() //根据数组索引值升序排列
krsort() //根据数组索引值降序排列
shuffle($arr);//打乱数组排序
$a1=array_rand($arr,2);//产生两个随机索引,索引号
print_r(array_count_values($arr));//统计数组中元素出现的次数
array_combine($arrr1,$arr2);//数组联合$arr1是键名
array_merge();//合并两个数组
array_merge_recursive();//去除重复
array_key_exists($key,$arr);//判断$arr中是否有$key键名
in_array($value,$arr);//查找是否存在$value
array_sum();//计算数组中数字的和
array_values(array_unique($arr));//去除重复值,并重新排索引(针对数字)
key();//获取数组的键名
使用implode()函数可以分割数组,作为字符串处理
Array_keys();//获取键名
Array_values();//获取键值
$arr=array(“a”=>”php”,”b”=>”php”,”c”=>”jsp”,”d”=>”asp”);
printf(“国家:%s\n”,implode(“,”,array_keys($arr)));
printf(“语言:%s\n”,implode(“,”,array_values($arr)));
count() sizeof()用于统计数组的元素个数
array_flip();//将数组的键与值对调
array_unshift();//在数组的顶部插入元素
array_splice();//任意位置插入
reset(array);//数组复位,使用each时使用