使用php内置函数 array_unshift ,下面就将 array_unshift 这个函数的用法列举一下。
array_unshift
该函数的作用是在数组开头插入一个或多个元素。被加上的元素作为一个整体添加,这些添加的元素在数组中的顺序和在参数中的顺序一样。修改后的数组中所有的数值键名将修改为从零开始重新计数,所有的文字键名保持不变。该函数会返回操作后数组中元素的个数。
语法:int array_unshift ( array &$array ,mixed $var [,mixed $... ] )
例如:
代码如下 | 复制代码 |
<?php $queue = array("111cn.net",".com"); array_unshift($queue,"apple","raspberry"); print_r($queue); 以上例程会输出: Array |
当然我们还可以直接使用其它的办法了,如创建一个数组重新给他赋值即可
deque,全名double-ended queue,是一种具有队列和栈的性质的数据结构。双端队列中的元素可以从两端弹出,其限定插入和删除操作在表的两端进行。双向队列(双端队列)就像是一个队列,但是你可以在任何一端添加或移除元素。双端队列(deque)是由一些项的表组成的数据结构,对该数据结构可以进行下列操作:
push(D,X) 将项X 插入到双端队列D的前端
pop(D) 从双端队列D中删除前端项并将其返回
inject(D,X) 将项X插入到双端队列D的尾端
eject(D) 从双端队列D中删除尾端项并将其返回
PHP实现代码
代码如下 | 复制代码 |
<?php class DoubleQueue { public $queue = array(); /**(尾部)入队 **/ public function addLast($value) { return array_push($this->queue,$value); } /**(尾部)出队**/ public function removeLast() { return array_pop($this->queue); } /**(头部)入队**/ public function addFirst($value) { return array_unshift($this->queue,$value); } /**(头部)出队**/ public function removeFirst() { return array_shift($this->queue); } /**清空队列**/ public function makeEmpty() { unset($this->queue); } /**获取列头**/ public function getFirst() { return reset($this->queue); } /** 获取列尾 **/ public function getLast() { return end($this->queue); } /** 获取长度 **/ public function getLength() { return count($this->queue); } } |
例子
编写支持双端队伍的例程,每种操作均花费O(1)时间
代码如下 | 复制代码 |
<?php 结果 0 |
代码如下 | 复制代码 |
<?php |
str_replace可查找替换常规字符,
preg_replace可查找替换回车换行字符(\r\n)
preg_replace常用在
代码如下 | 复制代码 |
|
内容的过滤,过滤回车换行(\r\n)等
把
代码如下 | 复制代码 |
<a href="/%E5%8A%A8%E4%BD%9C%E5%86%92%E9%99%A9_1.html1">首页</a> <a href="/%E5%8A%A8%E4%BD%9C%E5%86%92%E9%99%A9_1.html0" class="a1">上一页</a> |
用str_replace函数和preg_replace函数替换成
代码如下 | 复制代码 |
<a href="/%E5%8A%A8%E4%BD%9C%E5%86%92%E9%99%A9_1.html">首页</a> <a href="/%E5%8A%A8%E4%BD%9C%E5%86%92%E9%99%A9_1.html" class="a1">上一页</a> |
例子
代码如下 | 复制代码 |
$pages = $keyword_data_db->pages; |
再看个比较例子
代码如下 | 复制代码 |
echo microtime(true)-$t, "/n"; //0.4768660068512 2.7257590293884 |
区别
区别就是str_replace被替换(查找)的内容是固定的、确定的,当然可以使用变量,但是变量也表示固定的、确定的内容,比如可以完成把所有的\n替换为<br>等场合。
而preg_replace被替换(查找)的内容是用规则来描述的,比如可以把所有的<和>之间的内容(HTML代码)替换掉。当然preg_replace也可以用来替换固定内容。
根据以上规则,所有str_replace能做的事情preg_replace都能办到,但是preg_replace的速度要慢些,使用也要复杂些,所以我们应该尽力使用str_replace。
星际的一些兵种会有不止一种状态,比如坦克可以架起来,机枪兵可以打兴奋剂,甚至还有一些被动的,比如被虫族女王喷洒绿色液体后,敌人的行动变慢。如果按照一般的思路,每次我们对一个小兵进行操作的时候,比如一辆坦克,我们都要用if判断他的状态,这样代码中会有很多的if,else或者swith。
不过我们可以发现,我们需要的是他在某个状态下的行为,如果把这些行为按照状态封装起来,就可以减少大量的判断。
待解决的问题:封装坦克的状态,让状态自己去控制行为。
思路:把状态作为属性,兵种类本身只控制状态的变化,具体的行为由状态类定义。
状态(State)模式示例:
代码如下 | 复制代码 |
<?php //坦克状态的接口 interface TankState { //坦克的攻击方法 public function attack(); } //坦克普通状态 class TankState_Tank implements TankState { //坦克的攻击方法 public function attack() { //这里简单的输出当前状态 echo "普通状态"; } } //坦克架起来的状态 class TankState_Siege implements TankState { //坦克的攻击方法 public function attack() { //这里简单的输出当前状态 echo "架起来了"; } } //坦克类 class Tank { //状态 public $state; //坦克的攻击方法 public function __construct() { //新造出来的坦克当然是普通状态 $this->state = new TankState_Tank(); } //设置状态的方法,假设参数为玩家点击的键盘 public function setState($key) { //如果按了s if($key = 's') { $this->state = new TankState_Siege(); } //如果按了t elseif($key = 't') { $this->state = new TankState_Tank(); } } //坦克的攻击方法 public function attack() { //由当前状态自己来处理攻击 $this->state->attack(); } } //新造一辆坦克 $tank = new Tank(); //假设正好有个敌人路过,坦克就以普通模式攻击了 $tank->attack(); //架起坦克 $tank->setState('s'); //坦克再次攻击,这次是架起模式 $tank->attack(); ?> |
用途总结:状态模式可以将和状态相关的行为和属性封装,除了切换状态时,其它地方就不需要大量的判断当前状态,只要调用当前状态的方法等。
实现总结:用一个接口规范状态类需要实现的方法,比如上面的TankState规定了attack()。把各个状态封装成类,将不同状态下的不同方法放入各自的状态类,比如上面的攻击方法,同时所有的状态执行接口。原来的事务类,比如上面的Tank类,只负责状态切换,一旦需要某一个方法的调用,只要交给当前状态就可以了