PHP效率开发--数组中的引号

 

PHP效率开发--数组中的引号

数组概述

       数组,作为一种简单的线性数据结构,在程序开发的过程中时常会被用到。PHP将数组分为两类:数值数组和关联数组。

       数值数组和大多数其它语言的使用方法一样:在一对中括号中加上一个数字表示要存取的值在数组中的存放位置。例如:$array[0] = ”value”。

       关联数组是PHP的一大亮点,它通过使用字符串来索引数组,例如在某个水果销售系统中,我们要为几种水果指定价格,于是我们可以这样写:$price[‘Apple’] = 1.8; $price[‘Banana’] = 4.6; $price[Pear] = 2.8; $price[Other] = 0.5; 。

 

问题出现

       从上面的例子可以看出关联数组使得我们的代码更加清晰,同时在很大程度上提高了开发效率。细心的可能会发现在我们举例关联数组时,前两个数组中(Apple和Banana)的字符串索引我们加上了单引号,而后面两个(Pear和Other)则没有!是的,为了提高开发效率,PHP允许我们在使用关联数组时不必给数组的索引字符串加上引号。这确实给我们带来了很大的方便:首先PHPer不必在每次写数组时都要记得加上烦人的引号;其次可以避免引号配对问题。不过这带来了另外的一个问题――性能。在接下来的文章中我们将通过例子来解释这个现象。

性能测试

性能和效率之间似乎总是呈反比的,有时为了效率我们必须牺牲性能,有时有不得不反过来,不过在这里我们应该选择哪个呢?先看下面的代码:

 


<?

       //定义一个存放临时数据的文件

       $fp=fopen('delete.txt','w');

       //初始化数组

       $array=array('name'=>'value');

       //定义循环次数

       $LOOPTIMES=100;

       //得到初始时间

       $t0=number_format(microtime(true),10,'.','');

       //循环显示没有使用引号的数组

       for($i=0;$i<$LOOPTIMES;$i++)

              fputs($fp,$array[name]);

       $t1=number_format(microtime(true),10,'.','');

       $rs1=$t1-$t0;

       //循环显示使用了引号的数组

       for($i=0;$i<$LOOPTIMES;$i++)

              fputs($fp,$array['name']);

       $t2=number_format(microtime(true),10,'.','');

       $rs2=$t2-$t1;

//     显示结果

       echo "$t1 - $t0 = ".$rs1." ";

       echo "$t2 - $t1 = ".$rs2." ";

       fclose($fp);

?>

 

上面的代码分别循环100次使用大引号的关联数组和不代引号的关联数组,最后输出它们所消耗的时间。下图显示了允许程序10次后的结果:

 


在10次的测试中,使用引号所花费的平均时间为0.003,而没使用引号的平均时间为0.032911,大约是前者的10倍!

总结

       从上的例子中可以看出:不使用引号的关联数组所带来的优点比较起来其,在关联数组中使用引号将使得程序的性能得到很大的提升。而且由于有了像Zend这样优秀的PHP集成开发环境,它不仅能为PHP字符串自动添加引号,而且配备了出色的代码检查功能。这使得我们更没有理由继续使用没有引号的关联数组。

 

 

 

 

更新:

一定要加引号,如果不加引号,则方括号中是一个常量,PHP 可能会在以后定义此常量,不幸的是你的代码中有同样的名字。
它能运行,是因为 PHP 自动将裸字符串(没有引号的字符串且不对应于任何已知符号)转换成一个其值为该裸字符串的正常字符串。
例如,如果没有常量定义为 anykey,PHP 将把它替代为 'anykey' 并使用之。
 

结果:$arr['a'] 的效率高于 $arr[a];