php向list数组中增加值的方法

 更新时间:2016年11月25日 14:59  点击:1356
文章是一个简单应用实例利用foreach遍历数组,然后给数组增加一些值进去了,方法比较简单,本文章后来介绍了直接使用array_push 来给数组增加值两者本人更喜欢后者一些。

例1

 代码如下 复制代码

foreach($list as &$value){
  
   if(isOnline($value['uid'])){
   $value['sid'] = '1';
  
   }else{
      $value['sid'] = '0';
         }
         $value['likes']='1';
   $sql="SELECT uid,likes,flower  FROM ".DB::table("dmember_member_count")." WHERE uid='".$value['uid']."'";
   $fff = DB::query($sql);
   $ffff = DB::fetch($fff);
   //print_r($ffff);
  
   $value['flower']=$ffff['flower'];
   $value['likes']=$ffff['likes'];
  }

例子 2,array_push() 函数

 代码如下 复制代码

<?php
$a=array("Dog","Cat");
array_push($a,"Horse","Bird");
print_r($a);
?>

输出:

Array ( [0] => Dog [1] => Cat [2] => Horse [3] => Bird )

例子 3
带有字符串键的数组:

 代码如下 复制代码

<?php
$a=array("a"=>"Dog","b"=>"Cat");
array_push($a,"Horse","Bird");
print_r($a);
?>

输出:

Array ( [a] => Dog [b] => Cat [0] => Horse [1] => Bird )

文件名:一律小写,单词间以下划线分隔,类名:采用首字母大写的驼峰命名方式 类中的方法名:采用首字母小写的驼峰方式命名 类中的私有方法和私有变量:以下划线开头 函数名(变量名):全小写,单词间以下划线分隔

下面具体介绍

Θ 类文件都以.class.php为后缀,使用驼峰法命名,并且首字母大写,例如 Pay.class.php;
Θ 类名和目录_文件名一致。例如:类名Zend_Autoloader的目录是Zend/Autoloader.class.php;
Θ 函数的命名使用小写字母和下划线的方式。例如:get_client_ip;
Θ 方法的命名使用驼峰法,首字母小写或者使用下划线”_”,例如listComment(),_getResource(),通常下划线开头的方法属于私有方法;
Θ 属性的命名使用驼峰法,首字母小写或者使用下划线”_”,如$username,$_instance,通常下划线开头的属性属于私有属性;
Θ 常量以大写字母和下划线”_”命名,如”HOME_URL”;

理解一下消化一下:

1.缩进及行的长度

缩进4个空格,而不是tab(有些编辑器可以配置一个tab代表多个空格,注意是空格);每行保持大约75-85个字符的长度

2.控制结构

这个部分最容易忽略,也是影响代码美感最重要的方面,例子很详细了,受益匪浅。

 代码如下 复制代码

<?php
if ((condition1) || (condition2)) {
    action1;
} elseif ((condition3) && (condition4)) {
    action2;
} else {
    defaultaction;
}
?>
<?php
switch (condition) {
case 1:
    action1;
    break;

case 2:
    action2;
    break;

default:
    defaultaction;
    break;
}
?>

<?php

if (($condition1
    || $condition2)
    && $condition3
    && $condition4
) {
    //code here
}
?>

<?php

$a = $condition1 && $condition2
    ? $foo : $bar;

$b = $condition3 && $condition4
    ? $foo_man_this_is_too_long_what_should_i_do
    : $bar;
?>

3.函数调用

 代码如下 复制代码

<?php
$var = foo($bar, $baz, $quux);
$short         = foo($bar);
$long_variable = foo($baz);
?>

4.类名规范

 代码如下 复制代码

<?php
class Foo_Bar
{

    //... code goes here

}
?>

5.方法名规范(驼峰命名 )

 代码如下 复制代码

<?php
function fooFunction($arg1, $arg2 = '')
{
    if (condition) {
        statement;
    }
    return $val;
}
?>

6.数组定义规范

 

 代码如下 复制代码

<?php

$some_array = array(
    'foo'  => 'bar',
    'spam' => 'ham',
);
?>

7.注释

http://pear.php.net/manual/en/standards.sample.php

http://pear.php.net/manual/en/standards.header.php

8.Including Code

任何时候都应该采用include_once或者require_once

require_once 'foo.php'

如果你使用的确php代码我们可以使用$_SERVER[HTTP_X_REWRITE_URL]与ORIG_PATH_INFO来判断你所使用的环境是iis还是apache了

if(isset($_SERVER['HTTP_X_REWRITE_URL'])) // IIS

else if(isset($_SERVER['ORIG_PATH_INFO']))  // IIS 5.0 CGI

//以上两行代码,在yii里的,原样复过来的。

//只作参考

 

本文章要讲到的PHP设计模式中包括有值对象模式、策略模式、观察者模式、命令模式四种模式,下面我一一给各位同学详细介绍希望文章对大家会带来帮助。

一、值对象模式

再说设计模式-值对象模式之前,你要了解值传递和引用传递:

PHP设计模式实例学习笔记
1.值对象模式概念:
如果你把同一个对象资源赋值给两个不同的变量,然后改变其中的一个变量,另一个变量仍然不受影响。这就是使用值对象模式的目的。
看下面例子:

 代码如下 复制代码
<?php
 
class BadDollar {
  protected $amount;
 
  public function __construct($amount=0) {
    $this->amount = (float)$amount;
  }
 
  public function getAmount() {
    return $this->amount;
  }
 
  public function add($dollar) {
    $this->amount += $dollar->getAmount();
  }
}
 
class Work {
  protected $salary;
 
  public function __construct() {
    $this->salary = new BadDollar(200);
  }
 
  public function payDay() {
    return $this->salary;
  }
 
}
 
class Person {
  public $wallet;
}
 
 
$job = new Work;
$p1 = new Person;
$p2 = new Person;
$p1->wallet = $job->payDay();
print_r($p1->wallet->getAmount()); //200
 
$p2->wallet = $job->payDay();
print_r($p2->wallet->getAmount()); //200
 
$p1->wallet->add($job->payDay());
print_r($p1->wallet->getAmount()); //400
 
//this is bad — actually 400
print_r($p2->wallet->getAmount()); //400
 
//this is really bad — actually 400
print_r($job->payDay()->getAmount()); //400


看上面例子,可以知道明显的错误是$p1和$p2使用的是同一个BadDollar对象,首先,类Work和类Person的实例已经创建。那么,假设每一个雇员最初有一个空的电子钱包,雇员的电子钱包Person:wallet是通过Work::payDay()函数返回的对象资源变量赋值的,所以被设定为一个BadDollar类的对象实例。实际上,$job::salary,、$p1::wallet和$p2::wallet指向的是同一个对象的实例。
使用值对象模式,重新设计Dollar对象如下

 代码如下 复制代码

class Dollar {
  protected $amount;
 
  public function __construct($amount=0) {
    $this->amount = (float)$amount;
  }
 
  public function getAmount() {
    return $this->amount;
  }
 
  public function add($dollar) {
    return new Dollar($this->amount + $dollar->getAmount());
  }
}

可以看到,主要的变化在于Dollar:add()函数中,它是创建并返回一个新的Dollar实例,所以,尽管你指定当前对象给多个变量,但是每一个变量的变化都不会影响其它的变量实例。
值对象模式设计注意:

1.保护值对象的属性,禁止被直接访问。

2.在构造函数中就对属性进行赋值。

3.去掉任何一个会改变属性值的方式函数(setter),否则属性值很容易被改变

二、策略模式

1.策略模式概念
策略模式针对一组算法,将每一个算法封装到具有共同接口的独立的类中,此模式让算法的变化独立于使用算法的客户。从而让程序结构更灵活,具有更好的扩展性和维护性
2.策略模式结构图

PHP设计模式实例学习笔记

3.策略模式角色说明
    抽象策略(Strategy)角色:定义所有支持的算法的公共接口。通常是以一个接口或抽象来实现。Context使用这个接口来调用其ConcreteStrategy定义的算法。
    具体策略(ConcreteStrategy)角色:以Strategy接口实现某具体算法
    环境(Context)角色:持有一个Strategy类的引用,用一个ConcreteStrategy对象来配置
4.策略模式实例 
比如说购物车系统,在给商品计算总价的时候,普通会员肯定是商品单价乘以数量,但是对中级会员提供8者折扣,对高级会员提供7折折扣,这种场景就可以使用策略模式实现:

 代码如下 复制代码

<?php

//抽象策略角色《为接口或者抽象类,给具体策略类继承》
interface Strategy
{
    public function computePrice($price);
}
 
//具体策略角色-普通会员策略类
class GenernalMember implements Strategy
{
    public function computePrice($price)
    {
        return $price;
    }
}
 
//具体策略角色-中级会员策略类
class MiddleMember implements Strategy
{
    public function computePrice($price)
    {
        return $price * 0.8;
    }
}
 
//具体策略角色-高级会员策略类
class HignMember implements Strategy
{
    public function computePrice($price)
    {
        return $price * 0.7;
    }
}
 
//环境角色实现类
class Price
{
    //具体策略对象
    private $strategyInstance;
   
    //构造函数
    public function __construct($instance)
    {
        $this->strategyInstance = $instance;
    }
   
    public function compute($price)
    {
        return $this->strategyInstance->computePrice($price);
    }
}
 
//客户端使用
$p = new Price(new HignMember());
 
$totalPrice = $p->compute(100);
 
echo $totalPrice; //70


三、命令模式

1.命令模式概念:
将来自客户端的请求传入一个对象,从而使你可用不同的请求对客户进行参数化。用于“行为请求者”与“行为实现者”解耦,可实现二者之间的松耦合,以便适应变化。 
2.参与者:

  • Command(命令):在一个方法调用之上定义一个抽象;
  • ConcreteCommand(具体的命令):一个操作的实现;
  • Invoker(调用者):引用Command实例作为它可用的操作。

 

 代码如下 复制代码
<?php
//命令
interface Validator 

    /** 
     * The method could have any parameters. 
     * @param mixed 
     * @return boolean 
     */
    public function isValid($value); 

 
//具体命令
class MoreThanZeroValidator implements Validator 

    public function isValid($value) 
    { 
        return $value > 0; 
    } 

 
//具体命令
class EvenValidator implements Validator 

    public function isValid($value) 
    { 
        return $value % 2 == 0; 
    } 

 
//调用者
class ArrayProcessor 

    protected $_rule; 
 
    public function __construct (Validator $rule) 
    { 
        $this->_rule = $rule; 
    } 
 
    public function process(array $numbers) 
    { 
        foreach ($numbers as $n) { 
            if ($this->_rule->IsValid($n)) { 
                echo $n, " "; 
            } 
        } 
    } 

 
//客户端
$processor = new ArrayProcessor(new EvenValidator()); 
$processor->process(array(1, 20, 18, 5, 0, 31, 42));

在这个模式中,Invoker(调用者)知道传递给它的Command,无需依赖于真实的ConcreteCommand(具体的命令)实现,解决了通过配置进行方法调用相关的问题,如UI控件按钮和菜单等引用一个Command,它们的行为是通过通用的ConcreteCommand实例呈现的。

四、观察者模式

首先了解观察者模式的概念:一个对象通过添加一个方法(该方法允许另一个对象,即观察者 注册自己)使本身变得可观察。当可观察的对象更改时,它会将消息发送到已注册的观察者。这些观察者使用该信息执行的操作与可观察的对象无关。结果是对象可以相互对话,而不必了解原因。观察者模式是一种事件系统,意味着这一模式允许某个类观察另一个类的状态,当被观察的类状态发生改变的时候,观察类可以收到通知并且做出相应的动作;观察者模式为您提供了避免组件之间紧密耦。看下面例子你就明白了!
1.使用观察者模式实现消息推送

 代码如下 复制代码

<?php

//观察者
interface IObserver
{
 public function notify();
}
 
//定义可以被观察的对象接口
interface IObservable
{
 public function addObserver($observer);
}
 
//实现IObservable接口
class MessageSystem Implements IObservable
{
 private $_observers = array();
 
 public function addObserver($observer)
 {
  $this->_observers = $observer;
 }
 
 public function doNotify()
 {
  foreach($this->_observers as $o)
  {
   $o->notify();
  }
 }
}
 
//实现IObserver接口
class User Implements IObserver
{
 public function __construct($username)
 {
  echo "我是新用户{$username}<br/>";
 }
 //通知观察者方法
 public function notify()
 {
  echo '欢迎新用户';
 }
}
 
//使用
$u = new MessageSystem();
 
$u->addObserver(new User('小明'));
//$u->addObserver(new User('小红'));
//$u->addObserver(new User('小黑'));
 
$u->doNotify();


2.摘自PHPCHINA的一个不错例子:


/**
* 定义观察接口
*/
interface Subject
{
    public function Attach($Observer); //添加观察者
    public function Detach($Observer); //踢出观察者
    public function Notify(); //满足条件时通知观察者
    public function SubjectState($Subject); //观察条件
}
 
/**
* 观察类的具体实现
*/
class Boss Implements Subject
{
    public $_action;
   
    private $_Observer;
   
    public function Attach($Observer)
    {
        $this->_Observer[] = $Observer;
    }
   
    public function Detach($Observer)
    {
        $ObserverKey = array_search($Observer, $this->_Observer);
       
        if($ObserverKey !== false)
        {
            unset($this->_Observer[$ObserverKey]);
        }
    }
   
    public function Notify()
    {
        foreach($this->_Observer as $value )
        {
            $value->Update();
        }
    }
   
    public function SubjectState($Subject)
    {
        $this->_action = $Subject;
    }
}
 
/**
* 抽象观察者
*
*/
abstract class Observer
{
    protected $_UserName;
   
    protected $_Sub;
   
    public function __construct($Name,$Sub)
    {
        $this->_UserName = $Name;
        $this->_Sub = $Sub;
    }
   
    public abstract function Update(); //接收通过方法
}
 
/**
* 观察者
*/
class StockObserver extends Observer
{
    public function __construct($name,$sub)
    {
        parent::__construct($name,$sub);
    }
   
    public function Update()
    {
        echo $this->_Sub->_action.$this->_UserName." 你赶快跑...";
    }
}
 
$huhansan = new Boss(); //被观察者
 
$gongshil = new StockObserver("三毛",$huhansan); //初始化观察者
 
$huhansan->Attach($gongshil); //添加一个观察者
$huhansan->Attach($gongshil); //添加一个相同的观察者
$huhansan->Detach($gongshil); //踢出基中一个观察者
 
$huhansan->SubjectState("警察来了"); //达到满足的条件
 
$huhansan->Notify(); //通过所有有效的观察者

 

在php中条件语句主要用到if else与if elseif及swicth case之类的语句了,这两语句是用到最多的,下面我来给大家普通一下。

一、if…else语句

if...else 语句

在条件成立时执行一块代码,条件不成立时执行另一块代码

语法:

1、简单条件

if(条件){
        ……
    }
    else{
        ……
    }  

 代码如下 复制代码

<?php
if (date("D") == "Sat") echo " http://www.111cn.net提醒你周末了,狂欢去";
?>

范例:本例的执行部分有三行,不可省略大括号。

 代码如下 复制代码

<?php
if (file_exists("/usr/local/lib/php3.ini")) {
  echo "以下是 PHP3 的配置文件<p><pre>n";
  readfile("/usr/local/lib/php3.ini");
  echo "</pre>n";
}
?>


2、复杂条件

elseif 语句

与 if...else 配合使用,在若干条件之一成立时执行一个代码块

if(条件){
        ……
    }
    elseif(条件){
        ……
    }
    else{
        ……
}

范例:上面的例子来修改成更完整的处理。其中的 else 由于只有一行执行的指令,因此不用加上大括号。

 代码如下 复制代码
<?php
$f="/usr/local/lib/php3.ini";
if (file_exists($f)) {
  echo "以下是 PHP3 的配置文件<p><pre>n";
  readfile($f);
  echo "</pre>n";
} else echo "很抱歉,找不到 $f";
?>

--------------------------------------------------------------------------------

第三种就是递归的 if..else 循环,通常用在多种决策判断时。它将数个 if..else 拿来合并运用处理。

直接看下面的例子

 代码如下 复制代码

<?php
if ($a > $b) {
  echo "a 比 b 大";
} elseif ($a == $b) {
  echo  "a 等于 b";
} else {
  echo "a 比 b 小";
}
?>

上例只用二层的 if..else 循环,用来比较 a 和 b 两个变量。实际要使用这种递归 if..else 循环时,请小心使用,因为太多层的循环容易使设计的逻辑出问题,或者少打了大括号等,都会造成程序出现莫名其妙的问题

二、Switch语句

1 语法:

switch(表达式){
    case 值1:
                    语句
                    break;
    case 值2:
                    语句
                    break;
    default:
                没有匹配的值时执行的语句
}


工作原理:

1.对表达式(通常是变量)进行一次计算
2.把表达式的值与结构中 case 的值进行比较
3.如果存在匹配,则执行与 case 关联的代码
4.代码执行后,break 语句阻止代码跳入下一个 case 中继续执行
5.如果没有 case 为真,则使用 default 语句

 代码如下 复制代码

<?php
switch ($d=date("D"))
{
case "Mon";
  echo "周一";
  break;
case "Tue";
  echo "周二";
  break;
case "Wed";
  echo "周三";
  break;
case "Thu";
  echo "周四";
  break;
case "Fir";
  echo "周五";
  break;
case "Sat";
  echo "周六";
  break;
case "Sun";
  echo "周日";
  break;
}
?>

另外一个实例,利用switch实现一个页面多用途,首先建立test.php页面:

 代码如下 复制代码

<?php
echo "<a href='solution.php?action=add'>增加www.111cn.net</a><br><br>";
echo "<a href='solution.php?action=del'>删除</a><br><br>";
echo "<a href='solution.php?action=search'>查找</a><br><br>";
echo "<a href='solution.php?action=update'>更新</a>";
?>

  接着,让我们看看solution.php是如何处理这四种操作的。

 代码如下 复制代码

<?php
$action=$_GET["action"];

switch ($action)
{
 case "add":
 echo "现在可以实现增加功能!";
 break;
 case "del":
 echo "现在可以实现删除功能!";
 break;
 case "search":
 echo "现在可以实现查询功能!";
 break;
 case "update":
 echo "现在可以实现更新功能!";
 break;
}
?>

很简单,我们首先接收到action的值,运用switch语句根据action值的不同分别赋予它相应的操作。怎么样,是不是比大家想象中要简单很多?

[!--infotagslink--]

相关文章

  • php中eval()函数操作数组的方法

    在php中eval是一个函数并且不能直接禁用了,但eval函数又相当的危险了经常会出现一些问题了,今天我们就一起来看看eval函数对数组的操作 例子, <?php $data="array...2016-11-25
  • php 中file_get_contents超时问题的解决方法

    file_get_contents超时我知道最多的原因就是你机器访问远程机器过慢,导致php脚本超时了,但也有其它很多原因,下面我来总结file_get_contents超时问题的解决方法总结。...2016-11-25
  • Python 图片转数组,二进制互转操作

    这篇文章主要介绍了Python 图片转数组,二进制互转操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-03-09
  • HTTP 408错误是什么 HTTP 408错误解决方法

    相信很多站长都遇到过这样一个问题,访问页面时出现408错误,下面一聚教程网将为大家介绍408错误出现的原因以及408错误的解决办法。 HTTP 408错误出现原因: HTT...2017-01-22
  • php抓取网站图片并保存的实现方法

    php如何实现抓取网页图片,相较于手动的粘贴复制,使用小程序要方便快捷多了,喜欢编程的人总会喜欢制作一些简单有用的小软件,最近就参考了网上一个php抓取图片代码,封装了一个php远程抓取图片的类,测试了一下,效果还不错分享...2015-10-30
  • Android子控件超出父控件的范围显示出来方法

    下面我们来看一篇关于Android子控件超出父控件的范围显示出来方法,希望这篇文章能够帮助到各位朋友,有碰到此问题的朋友可以进来看看哦。 <RelativeLayout xmlns:an...2016-10-02
  • ps把文字背景变透明的操作方法

    ps软件是现在非常受大家喜欢的一款软件,有着非常不错的使用功能。这次文章就给大家介绍下ps把文字背景变透明的操作方法,喜欢的一起来看看。 1、使用Photoshop软件...2017-07-06
  • 怎么用PS为人像脸部增加打散颗粒特效

    用PS将人像脸部打造成打散颗粒的效果,成品出来后很美,过程略复杂,需要耐心和细心。现在跟着步骤来做吧! 1、首先在PS里面打开这张图。 2、选择快速选择工具的增加...2016-12-21
  • php数组操作 键名比较 差集 交集赋值

    本文章提供在量的数据中级操作实例有如对键名比较计算数组的差集 计算差集 给指定数组中插入一个元素 反转数组 交集赋值新的数组实例。 //定义回调函数 funct...2016-11-25
  • C#二维数组基本用法实例

    这篇文章主要介绍了C#二维数组基本用法,以实例形式分析了C#中二维数组的定义、初始化、遍历及打印等用法,具有一定参考借鉴价值,需要的朋友可以参考下...2020-06-25
  • intellij idea快速查看当前类中的所有方法(推荐)

    这篇文章主要介绍了intellij idea快速查看当前类中的所有方法,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2020-09-02
  • Mysql select语句设置默认值的方法

    1.在没有设置默认值的情况下: 复制代码 代码如下:SELECT userinfo.id, user_name, role, adm_regionid, region_name , create_timeFROM userinfoLEFT JOIN region ON userinfo.adm_regionid = region.id 结果:...2014-05-31
  • C#数组的常用操作方法小结

    Array数组在C#中同样是最基本的数据结构,下面为大家C#数组的常用操作方法小结,皆为细小的代码段,欢迎收看收藏...2020-06-25
  • js导出table数据到excel即导出为EXCEL文档的方法

    复制代码 代码如下: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta ht...2013-10-13
  • php curl模拟post请求和提交多维数组的示例代码

    下面一段代码给大家介绍php curl模拟post请求的示例代码,具体代码如下: <&#63;php$uri = "http://www.cnblogs.com/test.php";//这里换成自己的服务器的地址// 参数数组$data = array ( 'name' => 'tanteng'// 'passwor...2015-11-24
  • mysql 批量更新与批量更新多条记录的不同值实现方法

    批量更新mysql更新语句很简单,更新一条数据的某个字段,一般这样写:复制代码 代码如下:UPDATE mytable SET myfield = 'value' WHERE other_field = 'other_value';如果更新同一字段为同一个值,mysql也很简单,修改下where即...2013-10-04
  • ps怎么制作倒影 ps设计倒影的方法

    ps软件是一款非常不错的图片处理软件,有着非常不错的使用效果。这次文章要给大家介绍的是ps怎么制作倒影,一起来看看设计倒影的方法。 用ps怎么做倒影最终效果&#819...2017-07-06
  • js基础知识(公有方法、私有方法、特权方法)

    本文涉及的主题虽然很基础,在许多人看来属于小伎俩,但在JavaScript基础知识中属于一个综合性的话题。这里会涉及到对象属性的封装、原型、构造函数、闭包以及立即执行表达式等知识。公有方法 公有方法就是能被外部访问...2015-11-08
  • 安卓手机wifi打不开修复教程,安卓手机wifi打不开解决方法

    手机wifi打不开?让小编来告诉你如何解决。还不知道的朋友快来看看。 手机wifi是现在生活中最常用的手机功能,但是遇到手机wifi打不开的情况该怎么办呢?如果手机wifi...2016-12-21
  • PHP 验证码不显示只有一个小红叉的解决方法

    最近想自学PHP ,做了个验证码,但不知道怎么搞的,总出现一个如下图的小红叉,但验证码就是显示不出来,原因如下 未修改之前,出现如下错误; (1)修改步骤如下,原因如下,原因是apache权限没开, (2)点击打开php.int., 搜索extension=ph...2013-10-04