5.2 一维数组的创建
当一个变量承载多个选项(例如“兴趣爱好”选项有35项之多或表中的一条记录有多个列)时,经常使用一维数组保存这些选项。PHP中有两种创建一维数组的方法:直接将变量声明为数组元素和使用array()语言结构创建数组。
5.2.1 直接将变量声明为数组元素
将一个变量声明为一个数组元素有以下3种方法。
方法1 不指定数组元素的“键”
示例程序:$characters[ ] = "humour";
上面的PHP语句定义了一个名字为$characters的数组,并向该数组中添加了一个数组元素。方括号“[ ]”定义的是该数组元素的“键”,该键对应的“值”为字符串“humour”。当数组新元素的“键”没有指定时,新元素的“键”在已有元素最大整数“键”的基础上递增(数组没有整数“键”时,则从零开始递增)。例如程序createArray1.php如下。
<?php
$characters[] = "humour";
$characters[] = "optimism";
print_r($characters); //输出:Array ( [0] => humour [1] => optimism )
?>
程序createArray1.php中的print_r()函数按照“[键]=>值”的格式显示数组的内容,该程序运行过程中的内存分配图如图5-2所示。
方法 2 将数组元素的“键”指定为某个整数
示例程序:$interests[2] = "music";
上面的 PHP 语句定义了一个名字为$interests的数组,并向该数组中添加了一个数组元素。“[2]”定义的是该数组元素的“键”为整数2,该“键”所对应的“值”为字符串“music”。例如如下程序createArray2.php,该程序运行过程中的内存分配图如图5-3所示。
<?php
$interests[2] = "music";
$interests[5] = "movie";
$interests[1] = "computer";
$interests[] = "software";
print_r($interests);/*输出:Array ( [2] => music [5] => movie [1] => computer [6] => software )*/
?>
程序createArray2.php说明如下。
(1)PHP数组是一个“有序”的容器,数组按照向数组添加元素的顺序进行输出,而不是按照“键”的大小进行输出,可以将数组的这个特性称为数组元素的有序性。
(2)PHP数组中的每个元素是一个“键值对”(key=>value)。
(3)PHP数组中的整数“键”不要求必须连续。
方法3 将数组元素的“键”指定为某个字符串
示例程序:$colors["red"] = "red";
上面的 PHP 语句定义了一个名字为$colors 的数组,并向该数组中添加了一个数组元素。“["red"]”定义的是该数组元素的“键”为字符串"red",该“键”所对应的值为字符串"red"。例如如下程序createArray3.php,该程序运行过程中的内存分配图如图5-4所示。
<?php
$colors["red"] = "red";
$colors["green"] = "green";
$colors[3] = "white";
$colors[] = "blue";
print_r($colors); //输出:Array ( [red] => red [green] => green [3] => white [4] => blue )
?>
5.2.2 使用array()语言结构创建数组
使用前面的方法创建数组时,每一条赋值语句仅为数组添加一个元素,显然有点儿笨拙,PHP提供了array()语言结构创建数组, array() 语言 结构接受一定数量用逗号分隔的 key => value 参数对,这样可以一次性地为数组添加多个元素(若key省略,则key值为整数)。例如程序createArray4.php如下,请读者自行分析其内存分配图。
<?php
$colors = array("red"=>"red","green",3=>"white",5);
print_r($colors); //输出:Array ( [red] => red [0] => green [3] => white [4] => 5 )
?>
程序createArray4.php和下面的程序功能等价。
<?php
$colors["red"] = "red";
$colors[] = "green";
$colors[3] = "white";
$colors[] = 5;
print_r($colors); //输出:Array ( [red] => red [0] => green [3] => white [4] => 5 )
?>
5.2.3 创建数组的注意事项
创建数组时需要注意以下几个事项。
(1)如果数组元素中的“键”是一个浮点数,则“键”将被强制转换为整数(例如浮点数 8.0将被强制转换为整数8);如果“键”是TRUE或FALSE,则“键”将被强制转换为整数1或0。
(2)如果数组元素中的“键”是一个字符串,且该字符串完全符合整数格式时,数组元素的“键”将被强制转换为整数(例如 "9" 将被强制转换为整数9)。
(3)由于数组元素中的“键”唯一标识一个元素,因此数组中元素的“键”不能相等(使用= =比较)。如果两个数组元素的“键”相等,“键”对应的“值”将被覆盖。例如如下程序createArray5.php,该程序运行过程中的内存分配图如图5-5所示。
<?php
$interests[TRUE] = "movie";
$interests[FALSE] = "computer";
$interests[8.0] = "music";
$interests["9"] = "software";
$interests[] = "shopping";
$interests[9] = "others";
print_r($interests);/*输出:Array ( [1] => movie [0] => computer [8] => music [9] =>others [10] => shopping ) */
?>
(4)不要在 array() 语言结构中使用诸如“red=>"red"”键值对的方式创建数组元素,也不要使用诸如“$colors[red] = "red"”的赋值语句的方式创建数组元素,否则程序的可读性及运行效率将大打折扣,读者可以比较下面程序createArray6.php和createArray7.php。
程序createArray6.php
<?php
define("red","a");
$colors = array(red=>"red","green",3=>"white",5);
print_r($colors);
?>
程序createArray7.php
<?php
$colors = array(red=>"red","green",3=>"white",5);
print_r($colors);
?>
程序createArray6.php和程序createArray7.php的运行结果如图5-6和图5-7所示。
PHP预处理器会将程序createArray7.php中诸如“red=>"red"”键值对中的“键”red(不带引号的red)作为常量进行处理,由于程序中没有定义red常量,PHP预处理器会将red常量解释为"red"字符串。使用这样的方式定义数组元素,不仅降低了程序的可读性,同时也降低了程序的运行效率。
5.2.4 数组元素“值”的访问
访问数组元素值的方法和访问变量值的方法相同:通过指定数组名并在方括号内指定“键名”的方式“访问”数组元素的“值”。使用这样的方法访问数组,不仅可以读取某个数组元素的“值”,还可以为数组添加数组元素以及修改数组元素的“值”,并可以像访问“变量”一样访问数组元素的值。例如如下程序visitArray.php,该程序的运行结果如图5-8所示。
<?php
$colors = array("red"=>"red","green"=>"green","white"=>"white","blue"=>"blue");
$colors["black"] = "black"; //为数组添加数组元素:"black"=>"black"
$colors["red"] = "#FF0000"; //修改键为"red"的元素值:"red"=>"#FF0000"
print_r($colors);
echo "<br/>";
if(isset($colors["green"])){//使用isset()函数判断键为"green"的数组元素是否定义
echo "我喜欢绿色。";
}
echo "<br/>";
unset($colors["green"]); //使用unset()函数取消键为"green"的数组元素的定义
if(!isset($colors["green"])){
echo "我又不喜欢绿色了。";
}
echo "<br/>";
echo gettype($colors["blue"]); //使用gettype()函数查看键为"blue"的数组元素的数据类型
echo "<br/>";
var_dump($colors["blue"]); //使用var_dump()函数得到键为"blue"的数组元素的数据类型及值
?>
PHP提供两种变量赋值方式:传值赋值和传地址赋值,对于数组同样适用。读者可以比较下面的两个程序byValue.php和byReference.php。
程序byValue.php
<?php
$colors1 = array("red"=>"red","green"=>"green","white"=>"white");
$colors2 = $colors1;
$colors2["blue"] = "blue"; //为数组$colors2添加元素:"blue"=>"blue"
$colors2["red"] = "#FF0000"; //修改数组$colors2“键”为"red"的元素值:"red"=>"#FF0000"
print_r($colors1);
echo "<br/>";
print_r($colors2);
?>
程序byReference.php
<?php
$colors1 = array("red"=>"red","green"=>"green","white"=>"white");
$colors2 = &$colors1;
$colors2["blue"] = "blue"; //为数组$colors1和$colors2添加数组元素:"blue"=>"blue"
$colors2["red"] = "#FF0000"; //修改数组$colors1和$colors2的元素值:"red"=>"#FF0000"
print_r($colors1);
echo "<br/>";
print_r($colors2);
?>
程序byValue.php和程序byReference.php的运行结果如图5-9所示和图5-10所示。
程序byValue.php运行过程中的内存分配图如图5-11所示。
程序byReference.php运行过程中的内存分配图如图5-12所示。
共有条评论 网友评论