领域让设计的基础知识总结

设若您就使了一段时间PHP的讲话,那么,你该就针对她的数组比较熟悉了——这种数量结构允许你当么变量中蕴藏多个价,并且可以把它当一个聚进行操作。

1. 啊是世界(Domain)

我们所召开的软件系统的目的都是来缓解一名目繁多问题,例如做一个电商系统来在线销售自己店的活;做一个灰度发布平台来提升服务的身分及安居。任何一个网都见面属于有特定的园地,例如:

  • 论坛是一个天地:要开一个论坛,那是论坛的为主业务是规定的:比如用户发帖、回帖等基本基本功能;
  • 电商系统是一个领域:只要是电商领域的系统,那核心业务便是:商品浏览、购物车、下单、减库存、付款交易相当骨干环节;

和一个领域的系统还抱有相同之中坚业务,因为她们而缓解的问题的面目是相仿之。因此可推断:一个天地本质上可了解为一个 问题域 。只要确定了网所属的领域,那么这个体系的主导业务,即只要化解的关键问题就着力规定了。通常咱们说,要变为一个天地的大方,必须要以这个小圈子深入研讨广大年才行,只有这样才见面逢好多之该领域的问题,积累了长的涉。

时,开发人员发现在PHP中采用这种多少结构对值或者数组元素进行排序非常管用。PHP提供了部分副多反复组的排序函数,这些函数允许你当频繁组中对素进行排,也允许用多不同的主意对她进行更排序。在这首文章被我们拿讨论该排序中最为要紧之几乎单函数。

2.界限上下文(Bounded Context)

寻常来说,一个世界有还只来一个中心问题,我们称为该领域的『核心子域』。在着力子域、通用子域、支撑子域梳理的同时,会定义有子域中之『限界上下文』及其关联,用其来 阐述子域之间的涉 。界限上下文可以大概了解成一个子系统或机件模块。

像:下图是针对酒店管理之子域和止上下文的梳理:

语言 1

大概排序

3. 世界模型(Domain Model)

领域让设计(Domain-Driven Design)分为两独号:

  1. 因为相同种领域专家、设计人员、开发人员都能够懂得的通用语言作为相互交流之家伙,在交流之过程中发现世界概念,然后以这些概念设计成一个世界模型;
  2. 出于世界模型驱动软件设计,用代码来促成该领域模型;

有鉴于此,领域让设计之基本是起家是的世界模型。领域模型有以下特点:

  1. 针对具有某边界的圈子的一个浮泛,反映了世界外用户 业务需求的庐山真面目 。它属于『解决问题空间』。领域模型是出边界的,只影响了我们在领域外所关心之一对,包括 实体概念(如:货物,书本,应聘记录,地址等),以及 过程概念(如:资金转化等);
  2. 增进软件之 可维护性,业务而理解性以及可重用性。领域模型确保了我们的软件之作业逻辑都于一个模中,帮助开发人员相对平缓地将世界知识转化为软件构造;
  3. 贯通软件 分析、设计、开发 的上上下下经过。领域专家、设计人员、开发人员面向同一个模进行交流,彼此共享文化以及信,所以可以防需求走样,让软件开发人员举行出来的软件真正满足急需;要起是的领域模型并无略,需要领域专家、设计、开发人员积极关系共同努力,然后才能够如大家对天地的认不断深入,从而持续细化与全面领域模型;
  4. 为了给世界模型看的呈现,使用的常用表达领域模型的法子:图、代码或文字;
  5. 要:领域模型是周软件之骨干,是软件中尽有价与太具竞争力的一些;设计足够出色且可业务需要的圈子模型能够又速的应需要转变;

  6. 天地通用语言


由于软件专家和领域专家合作开发一个天地的模型是发必不可少之。开发进程遭到,
开发人员以类、算法、设计模式、架构等进行思想与交流。但领域专家对此一无所知,他们本着技术及的术语没有尽多概念,只了解特有的世界专业技能,例如:在空中交通监控样例中,领域专家知道飞机、路线、海拔、经度、纬度,他们生好的术语来谈谈这些业务。软件专家与领域专家交流过程遭到,需要做翻译才会于对方知道这些概念。

领域让设计之一个中坚标准是用同一栽基于模型的语言。使用模型作言语的基本骨架,要求组织于拓展具有的交流是都采取同一的言语,在代码中吗是这样,这种语言为号称『通用语言』。

首先,让咱来看看最简便的情况:将一个数组元素于没有到高进行简要排序,这个函数既可遵循数字大小排列也得以字母顺序排列。PHP的sort()函数实现了这职能,如Listing
A
所示:

5.建模思考的问题:用户需要

『用户需要』不克同于『用户』,捕捉『用户中心之型』也无能够平等于『以用户也基本设计领域模型』。设计领域模型时不能够以用户也出发点去思考问题,不克尽想方用户会指向网做呀;而应该从一个合理的角度,根据用户需求挖掘出世界内的有关物,思考这些东西之本色关联及其变化规律作为出发点去思考问题。

天地模型是 排除了人之外的客体世界模型 ,包含了丁所扮演的参与者角色。但是一般景象下未使为参与者角色在领域模型中占有举足轻重位置,否则各个系统的天地模型将转移得无距离,因为软件系统便是一个人机交互的系统,都是为人数为主底运动记录或跟。例如:

  • 论坛中要因食指呢主干,那么领域模型就是:人发帖,人回帖,人结贴,等等;
  • 货托运系统遭到一旦盖人数也着力,就改为了:托运人托运货物,收货人收货物,付款人付款,等等;

以一个货物运输系统吧例简单说明一下。在用户需求相对明朗后,这样讲述领域模型:

  • 一个Cargo(货物)涉及多单Customer(客户,如托运人、收货人、付款人),每个Customer承担不同的角色;
  • Cargo的运载目标都指定,即Cargo有一个输目标;
  • 由同样层层满足Specification(规格)的Carrier
    Movement(运输动作)来形成运输目标;

上述描述没有自用户的角度去讲述领域模型,而是以世界外之相干东西也落脚点,考虑这些事物的原形关联及其变化规律的:

  • 盖商品也主导,把客户看成是货物在某个场景中或者会见提到到之关系角色,如货物会涉及到托运人、收货人、付款人;
  • 商品发出一个规定的靶子,货物会经过同系列之运动作到达目的地。

为用户为核心来考虑领域模型的沉思只是停留在求的表,而并未打通出真的急需的实质。领域建模时需要努力挖潜用户需求的精神,这样才真正贯彻用户要求。

Listing A

6. 藏分层架构

语言 2

 

用户界面/展示层:1)请求应用层获取用户所需要的显示数据;2)发送命令于应用层执行用户之通令

应用层:薄薄的平重叠,定义软件要水到渠成的任务。对外为展示层提供各种应用功能,对内调用领域层(领域对象要世界服务)完成各种事务逻辑。应用层不包含业务逻辑

天地层:表达业务概念、业务状态信息与业务规则,是工作软件的核心

基础设备层:为其他层提供通用的技能力量,提供了层间通信;为世界层提供持久化机制。

<?php

7. 用的模式

 $data = array(5,8,1,7,2);

7.1. 总览图

语言 3

 sort($data);

7.2. 涉及的统筹

干于领域建模的进程遭到那个重大,关联的计划性可以以如下的一部分条件:

  • 涉及 尽量少。对象中复杂的关联好形成对象的关系网,对于了解以及保安单个对象特别不利于,同时为特别麻烦分对象以及对象之间的鄂;另外,减少涉有助于简化对象期间的遍历;
  • 提到尽量保障 单向 的关系;
  • 在成立涉时,需要开是否有关联的 限制条件 。如果是,那么极端好拿范围条件加到事关上,往往这样的范围标准能够用关联化繁为简,即将多对多简化为1针对性几近,或将1针对性多简化为1针对1;

 print_r($data);

7.3. 实体(Entity)

实体就是小圈子面临需 唯一标识 的世界概念。因为我们有时候用区分是何许人也实体:有少独实体,如果唯一标识不一致,那么即便实体的另外所有属性都同样,也道他们是片只不等的实体。

无应有吃实体定义太多之性或作为,而相应找关联,将性能或行为易至另外涉嫌的实业或值对象上。比如:Customer
实体,有一部分地点信息,由于地方信息是一个总体的产生业务含义的概念,所以我们得以定义一个
Address 对象,然后把 Customer 的地址相关的音讯转换至 Address
对象上。如果无 Address 对象,而将这些地方信息一直放在 Customer
对象上,然后对有些其它的好像Address的音呢还直接在Customer
上,会促成 Customer 对象十分凌乱,结构不鲜明,最终导致它难以保障及喻。

 ?>

7.4. 值对象(Value Object)

并无是各个一个物都要有一个唯一标识。就为点的地点对象 Address
为条例,如果个别单 Customer 的地方信息是一律的,我们便见面认为当下半独 Customer
的地址是同一个。用程序的办法来发表就是是:如果少只目标有属性的价都平等,我们会认为它们是和一个靶,那么即使足以把这种对象设计吧价值对象。

值对象的特征:

  • 值对象 没有唯一标识 ,这是其跟实业的尽深异。值对象在认清是否是暨一个对象时是通过她的备属性是否一律,如果一致则当是与一个价值对象。在区分是否是暨一个实体时,只看实体的唯一标识是否一致,而无论是实体的属性是否相同。
  • 值对象是 不可变 的,即有属性都是才念之,所以可以吃安康的共享。

该给值对象设计之尽心简单,不要为其引用很多任何的对象。值对象仅是一个价,类似(int
a =
3)中之『3』,只不过是用对象来表示。值对象虽然是独念之,是一个整体的不可分割的圆,但是可为合替换掉:类似(a
= 4)把a的值由『3』替换为乎『4』,当修改 Customer 的 Address
对象引用时,不是透过 Customer.Address.Street
这样的不二法门来窜属性,可以如此做:Customer.Address = new Address(…)

出口结果如下所示:

7.5. 天地服务(Domain Service)

天地中的部分概念不极端相符建模为对象(实体对象或值对象),因为她本质上就是是一对操作、动作,而非是事物。这些操作往往得 协调多单领域对象。如果强行以这些操作职责分配受其它一个对象,则让分配的对象就是承受部分未该负担的任务,从而会招对象的职责不引人注目充分凌乱。DDD认为世界服务模式是一个分外自然之范式用来对号入座这种超越多单对象的操作。一般的天地对象还是发状态及表现的,而世界服务没有状态只有行为。

世界服务还有一个可怜重要的功力就是是足以避领域逻辑泄露及应用层。因为只要无领域服务,那么用层会直接调用领域对象好该是属世界服务该做的操作,需要了解每个领域对象的事情功能,以及她可能会见以及哪些其他世界对象交互等同样文山会海世界知识。这样一来,领域层可能会见拿部分天地知识泄露及应用层。对于应用层来说,通过调用领域服务提供的简练好亮且意义不言而喻的接口肯定也只要于直控制领域对象好的差不多。

说交世界服务,还用领取一下软件面临貌似生三种服务:应用层服务、领域服务、基础服务。从以下的事例中得以清晰的观望每种服务之天职:

应用层服务

  1. 获输入(如一个XML请求)
  2. 出殡信息于世界层服务,要求该促成转帐的事务逻辑
  3. 领域层服务处理成,则调用基础层服务发送Email通知

世界层服务

  1. 获取源帐号和对象帐号,分别通报源帐号与目标帐号进行扣除金额和增金额的操作
  2. 供返回结果吃应用层

基础层服务

  1. 以应用层的求,发送Email通知

Array ([0] => 1

7.6. 聚集及聚合根(Aggregate,Aggregate Root)

集定义了同样组有 内聚关系 的有关对象的汇聚,以及对象期间清晰的所属关系与边界,避免了复杂的难以保障的对象关系网之朝三暮四。我们把集看作是一个改动数据的单元。

聚拢出以下特征:

  1. 每个聚合出一个根和一个边界:根是会师内的某某实体;边界定义了一个集内部发生什么实体或值对象;
  2. 聚合根是标可以保障对聚集引用的唯一元素,负责和表面其他对象打交道并保护团结中的业务规则。聚合内部的靶子之间可并行引用,但是聚合外部如果假定顾聚合内部的目标时,必须经聚合根开始导航,绝对免能够绕了聚合根直接访问聚合内之靶子;
  3. 集结内除了根外面的外实体的绝无仅有标识都是地方标识,也就算是只要以聚集内部保持唯一即可,因为它连接从属于这个集的;
  4. 会合内部的靶子好保对另外聚合根的援;
  5. 删去一个聚合根时必以删除该聚合内的备相关对象,因为他俩还跟属一个集,是一个圆的定义;
  6. 冲聚合的如上概念,我们得以想见出由数据库查询时的单元也是以凑为一个单元,不克直接询问聚合内部的某某非根的对象;

怎鉴别聚合:

足自事情的角度解析如何对象它们的关系是内聚的,可看成一个圆来设想的,然后这些目标足以放在一个聚合内。关系内聚是依赖这些目标期间必须保持一个稳定规则,固定规则是凭借于数变化时须保障不换的一致性规则。当修改一个会合时,必须于 事务级别 确保整个聚合内之具备目标满足这个稳定规则。聚合尽量不要太怪,否则恐怕带来一定之性问题。通常在多数领域模型中,有70%之联谊通常仅出一个实体,即聚合根,该实体内部没有含其他实体,只含部分价对象;另外30%之集合中,基本上也止含有两及三独实体。

哪鉴别聚合根:

设一个汇聚只生一个实体,那么这实体就是聚合根;如果起差不多单实体,那么我们好考虑聚合内哪个目标来独立在的意思又可以与标直接开展互动。

[1] => 2

7.7. 工厂(Factory)

DDD中之厂子也是同栽体现 封装思想 的模式。DDD中引入工厂模式的原故是:有时创建一个世界对象是一律项比较复杂的事体,不仅仅是简简单单的new操作。工厂是故来封装创建一个繁杂对象尤其是聚合时所欲的学识,将创建对象的底细(如何实例化对象,然后开什么样初始化操作)隐藏起来。

客户传递给工厂有简单易行的参数,如果参数符合业务规则,则工厂可以于中间创立有一个对应的园地对象回来给客户;但是如果参数无效,应该抛出异常,以保证无会见创有一个荒唐的对象。当然为并无总是用经过工厂来创建对象,事实上大部分场面下领域对象的创立都非会见太复杂,只需要简单的使用构造函数就好了。隐藏创建对象的利益:可以不被世界层的事务逻辑泄露及应用层,同时为减轻了应用层的背,它独自待简单的调用领域工厂创建有要的目标即可。

[2] => 5

7.8. 仓储(Repository)

囤被规划下的由来:领域模型中之对象从创办后无见面直接留于内存活动,当它们不走经常见面吃持久化到DB中,当用之上会重建该目标。所以,重建对象是一个跟DB打交道的长河,需要提供相同种体制,提供类似集合的接口来提携我们 管理对象。

积存里存放的目标自然是集,因为前面提到的领域模型是坐聚集的概念来分边界的。我们 只针对聚集设计仓储 ,把全部聚合看成一个圆,要么一起得到出来,要么一起吃删,不会见单独对某个聚合内的分段对象开展独立查询以及换代。仓储还有一个重要的性状就是是分为仓储定义有与贮实现部分,在圈子模型中定义仓储的接口,而以基础设备层实现具体的仓储。

[3] => 7

8.统筹领域模型时相似步骤

  1. 冲需求建立起的小圈子模型,识别显然的领域概念和里的关联(1:1,
    1:n的关系),用文字规范没有歧义的叙说来每个领域概念的意思;
  2. 解析主要的软件功能,识别关键的应用层的近乎,这样有助于及早发现什么样是应用层的任务,哪些是小圈子层的职责;
  3. 愈来愈分析世界模型,识别出实体、值对象、领域服务;
  4. 分析涉,通过对作业的深入解析与软件设计原则及性能方面的衡量,明确提到的样子,去丢一部分勿需之关联;
  5. 招来来聚合边界与聚合根,在条分缕析过程遭到会现出麻烦清洗判断的挑题材,这就是凭借平时分析涉的积攒了;
  6. 为聚合根配置仓储,一般情形下也一个会合分配一个储存,此时计划好仓储的接口即可;
  7. 遍历所有场景,确定计划的园地模型能立竿见影解决工作需;
  8. 考虑怎么创造实体和价值对象,是透过工厂还是构造函数;
  9. 重构模型,寻找模型中生出问号或浅的地方,比如思考:聚合的筹划是否正确,模型的性质等等;

领域建模是一个频频重构,持续到家的经过,大家会在讨论中将变化之一部分体现到模型中,从而模型不断细化并朝是的矛头走。

[4] => 8

9. 参考

  • http://www.cnblogs.com/netfocus/archive/2011/10/10/2204949.html
  • 《实现世界让设计》

正文是看学习 汤雪华的博客 后所做的有整理,希望能够针对大家所有助~

)

也能够以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数组处理工具确保之里力量。

转载自:http://yuninglovekefan.blog.sohu.com/134103390.html

 

下是对准亚各项数组中的某某字段进行排序的少种植办法艺术:

PHP对屡次组的之一字段排序方法1

private function arrCmp($a,$b){  

if($a[‘day_time’] == $b[‘day_time’]){  

return 0;

}   

return($a[‘day_time’]<$b[‘day_time’]) ? -1 : 1;

}  

运用方法:

usort($new, array(“DeveloperController”, “arrCmp”));

 

数组原型:

Array (  

[0] => Array ( [day_time] => 1291161600 [one_sum_click_num] => 2 [two_sum_click_num] => 2 )  

[1] => Array ( [day_time] => 1291248000 [one_sum_click_num] => 7 [two_sum_click_num] => 5 )  

[2] => Array ( [day_time] => 1291334400 [one_sum_click_num] => 4 )  

[3] => Array ( [day_time] => 1291593600 [two_sum_click_num] => 2 ) ) )

这样子根据其数组中的 day_time字段进行排序。

下面是摘自php 手册上的说明。  

对数据库结果进行排序 方法2
本例中 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

 

 

 

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图