PHP 数组的操作

一、数组含义

PHP中数组实际上是一个有序映射,映射是一种把values关联到keys的类型。由于数组的元素也可以是另一个数组,所以树形结构和多维数组也是允许的。

数组就是一组数据的集合,把一系列数据组织起来,形成一个可操作的整体。数组的每个实体都包含两项:键和值。

PHP支持两种数组:索引数组(indexed array)和联合数组(associative array),前者使用数字作为键,后者使用字符串作为键。


二、数组结构

可以用 array() 语言结构来新建一个数组。它接受任意数量用逗号分隔的 键(key) => 值(value)对。

array(  key =>  value

, ...

)

// 键(key)可是是一个整数 integer 或字符串 string

// 值(value)可以是任意类型的值。

最后一个数组单元之后的逗号可以省略。通常用于单行数组定义中,例如常用 array(1, 2) 而不是 array(1, 2, )。

对多行数组定义通常保留最后一个逗号,这样要添加一个新单元时更方便。

自 5.4 起可以使用短数组定义语法,用 [] 替代 array()。

<?php
<span style="white-space:pre">	</span>$array = array( "foo" => "bar", "bar" => "foo");
<span style="white-space:pre">	</span>// 自 PHP 5.4 起
<span style="white-space:pre">	</span>$array = ["foo" => "bar", "bar" => "foo"];
?>

key 可以是 integer 或者 string。value 可以是任意类型。

此外 key 会有如下的强制转换:

1.包含有合法整型值的字符串会被转换为整型。例如键名 "8" 实际会被储存为 8。但是 "08" 则不会强制转换,因为其不是一个合法的十进制数值。

2.浮点数也会被转换为整型,意味着其小数部分会被舍去。例如键名 8.7 实际会被储存为 8。

3.布尔值也会被转换成整型。即键名 true 实际会被储存为 1 而键名 false 会被储存为 0。

4.Null 会被转换为空字符串,即键名 null 实际会被储存为 ""。

5.数组和对象不能被用为键名。坚持这么做会导致警告:Illegal offset type。

如果在数组定义中多个单元都使用了同一个键名,则只使用了最后一个,之前的都被覆盖了。

下面的例子中所有的键名都被强制转换为 1,则每一个新单元都会覆盖前一个的值,最后剩下的只有一个 "d"。

<?php
<span style="white-space:pre">	</span>$array = array(1=>"a",
<span style="white-space:pre">		</span>       "1"=>"b",
<span style="white-space:pre">		</span>       1.5=>"c",
<span style="white-space:pre">		</span>       true=>"d",);
<span style="white-space:pre">	</span>var_dump($array);
?>

显示结果:

array(1){[1]=>string(1)"d"}

PHP 数组可以同时含有 integer 和 string 类型的键名,因为 PHP 实际并不区分索引数组和关联数组。

如果对给出的值没有指定键名,则取当前最大的整数索引值,而新的键名将是该值加一。如果指定的键名已经有了值,则该值会被覆盖。


三、创建数组和数组的访问

创建数组有几种区别(不带key、带数字key、带字符串key、混合key、只有部分带key)

//没有键名的数组
<?php
$array = array("foo","bar","hallo","world");
var_dump($array);
?>
array(4) {[0]=>string(3) "foo",[1]=>string(3) "bar",[2]=>string(5) "hallo",[3]=>string(5) "world"}

//数字键名<span style="font-family: Arial, Helvetica, sans-serif;">的数组</span>
<?php
$array = array(2=>"a",
<span style="white-space:pre">	</span>       3=>"b",
<span style="white-space:pre">	</span>       4=>"c",
<span style="white-space:pre">	</span>       5=>"d",
);
var_dump($array);
?>
array(4) {[2]=>string(1) "a",[3]=>string(1) "b",[4]=>string(1) "c",[5]=>string(1) "d"}


//字符串键名<span style="font-family: Arial, Helvetica, sans-serif;">的数组</span>
<?php
$array = array("foo"=>"bar",
<span style="white-space:pre">	</span>       "bar"=>"foo",
<span style="white-space:pre">	</span>       "eye"=>100,
<span style="white-space:pre">	</span>       "gas"=>101,
);
var_dump($array);
?>
array(4) {["foo"]=>string(3) "bar",["bar"]=>string(3) "foo",["eye"]=>int(100),["gas"]=>int(101)}

//混合键名<span style="font-family: Arial, Helvetica, sans-serif;">的数组</span>
<?php
$array = array("foo" => "bar",
<span style="white-space:pre">	</span>       "bar" => "foo",
<span style="white-space:pre">	</span>       100 => 100,
);
var_dump($array);
?>
array(4) {["foo"]=>string(3) "bar",["bar"]=>string(3) "foo",["eye"]=>int(100)}


//部分带指定键名<span style="font-family: Arial, Helvetica, sans-serif;">的数组</span>
<?php
$array = array("a",
<span style="white-space:pre">	</span>       "b",
<span style="white-space:pre">	</span>       6 => "c",
<span style="white-space:pre">	</span>       "d",
);
var_dump($array);
?>
array(4) {[0]=>string(1) "a",[1]=>string(1) "b",[6]=>string(1) "c",[7]=>string(1) "d"}

特别注意:key 为可选项。如果未指定,PHP 将自动使用之前用过的最大 integer 键名加上 1 作为新的键名。

2. 数组的访问

数组单元可以通过 array[key] 和 array{key} 语法来访问。

<?php
$array = array("foo" => "bar",
<span style="white-space:pre">	</span>       42    => 24,
<span style="white-space:pre">	</span>       "multi" => array("dimensional" => array("array" => "foo"))
);
var_dump($array["foo"]);
var_dump($array[42]);
var_dump($array["multi"]["dimensional"]["array"]);
?>

string(3) "bar"
int(24)
string(3) "foo"

自 PHP 5.4 起可以用数组间接引用函数或方法调用的结果。之前只能通过一个临时变量。自 PHP 5.5 起可以用数组间接引用一个数组原型。

<?php
<span style="white-space:pre">	</span>function getArray() {
<span style="white-space:pre">		</span>return array(1, 2, 3);
<span style="white-space:pre">	</span>}
<span style="white-space:pre">	</span>// on PHP 5.4
<span style="white-space:pre">	</span>$secondElement = getArray()[1];
<span style="white-space:pre">	</span>// previously
<span style="white-space:pre">	</span>$tmp = getArray();
<span style="white-space:pre">	</span>$secondElement = $tmp[1];
<span style="white-space:pre">	</span>// or
<span style="white-space:pre">	</span>list(, $secondElement) = getArray();
?>

试图访问一个未定义的数组键名与访问任何未定义变量一样:会导致 E_NOTICE 级别错误信息,其结果为 NULL。


用方括号的语法新建/修改

可以通过明示地设定其中的值来修改一个已有数组。

这是通过在方括号内指定键名来给数组赋值实现的。也可以省略键名,在这种情况下给变量名加上一对空的方括号([])。

$arr[key] = value;

$arr[] = value;

// key 可以是 integer 或 string

// value 可以是任意类型的值

如果 $arr 还不存在,将会新建一个,这也是另一种新建数组的方法。

不过并不鼓励这样做,因为如果 $arr 已经包含有值(例如来自请求变量的 string)则此值会保留而 [] 实际上代表着字符串访问运算符。初始化变量的最好方式是直接给其赋值。

要修改某个值,通过其键名给该单元赋一个新值。要删除某键值对,对其调用 unset() 函数。

<?php
<span style="white-space:pre">	</span>$arr = array(5 => 1, 12 => 2);

<span style="white-space:pre">	</span>$arr[] = 56;    // This is the same as $arr[13] = 56;
<span style="white-space:pre">			</span>// at this point of the script

<span style="white-space:pre">	</span>$arr["x"] = 42; // This adds a new element to
<span style="white-space:pre">			</span>// the array with key "x"

<span style="white-space:pre">	</span>unset($arr[5]); // This removes the element from the array

<span style="white-space:pre">	</span>unset($arr);    // This deletes the whole array
?>

如上所述,如果给出方括号但没有指定键名,则取当前最大整数索引值,新的键名将是该值加上 1(但是最小为 0)。如果当前还没有整数索引,则键名将为 0。

注意这里所使用的最大整数键名不一定当前就在数组中。它只要在上次数组重新生成索引后曾经存在过就行了。以下面的例子来说明:

<?php

<span style="white-space:pre">	</span>// 创建一个简单的数组
<span style="white-space:pre">	</span>$array = array(1, 2, 3, 4, 5);
<span style="white-space:pre">	</span>print_r($array);

<span style="white-space:pre">	</span>// 现在删除其中的所有元素,但保持数组本身不变:
<span style="white-space:pre">	</span>foreach ($array as $i => $value) {
<span style="white-space:pre">		</span>unset($array[$i]);
<span style="white-space:pre">	</span>}
<span style="white-space:pre">	</span>print_r($array);

<span style="white-space:pre">	</span>// 添加一个单元(注意新的键名是 5,而不是你可能以为的 0)
<span style="white-space:pre">	</span>$array[] = 6;
<span style="white-space:pre">	</span>print_r($array);
<span style="white-space:pre">	</span>// 重新索引:
<span style="white-space:pre">	</span>$array = array_values($array);
<span style="white-space:pre">	</span>$array[] = 7;
<span style="white-space:pre">	</span>print_r($array);
?>
显示结果:

Array([0] => 1
[1] => 2
[2] => 3
[3] => 4
[4] => 5
)
Array()
Array([5] => 6)
Array([0] => 6
[1] => 7
)


四、数组的打印

在PHP中对数组元素输出,可以通过echo和print语句来实现,但这只能对数组中某一元素进行输出,要将数组结构输出则要使用print_r()函数。

语法格式:print_r(mixed expression)

参数expression为普通的整形、字符型或实型变量则输出该变量本身,如果该参数为数组,则按一定键值和元素的顺序显示出该数组中的所有元素。

当然还可以使用 var_dump($array) 的方法来输出数组。

五、遍历数组

遍历数组中的所有元素是常用的一种操作,在遍历的过程中可以完成查询或其他功能。在PHP中遍历数组的方法有多种,下面介绍最常用的两种方法。

<1>使用foreach结构遍历数组;

<2>使用list()函数遍历数组,list()函数仅能用于数字索引的数组,且数字索引从0开始。

<?php
<span style="white-space:pre">	</span>//输出用户登录信息
<span style="white-space:pre">	</span>while(list($name,$value)=each($_POST)){
<span style="white-space:pre">		</span>if($name!="submit"){
<span style="white-space:pre">			</span>echo "$name=$value<br>";
<span style="white-space:pre">		</span>}
<span style="white-space:pre">	</span>}
?>

六、数组的常用的函数

1. 使用count()函数对数组中的元素个数进行统计。

格式:int coun(mixed array[,int mode])

参数说明:参数array为必要参数,mode为可选参数,若选中COUNT_RECURSIVE(或1),本函数将递归地对数组数组。

<p class="p1"><?php</p><p class="p1"><span style="white-space:pre">	</span>$array = array("php" => array("PHP函数参考大全","PHP程序开发范例宝典","PHP数据库系统开发完全手册"),</p><p class="p1"><span style="white-space:pre">			</span>"asp" => array("ASP经验技巧宝典")</p><p class="p1"><span style="white-space:pre">			</span>); //声明一个二维数组</p><p class="p1"><span style="white-space:pre">	</span>echo count($array,COUNT_RECURSIVE);//递归统计数组元素的个数,运行结果为6</p><p class="p1">?></p>

注意:在统计二维数组时,如果直接使用count()函数只会显示一位数组的个数,所以使用递归的方式来统计二维数组的个数。


2. 使用sort()和rsort()分别对数组进行升序和降序

<?php
<span style="white-space:pre">	</span>$array=array(5,26,37,18,9,42,88,66);
<span style="white-space:pre">	</span>$array1=sort($array);
<span style="white-space:pre">	</span>for($i=0;$i<count($array);$i++){
<span style="white-space:pre">		</span>echo $array[$i]."  ";
<span style="white-space:pre">	</span>}
<span style="white-space:pre">	</span>echo "<br>"; 
<span style="white-space:pre">	</span>$array1=rsort($array);
<span style="white-space:pre">	</span>for($i=0;$i<count($array);$i++){
<span style="white-space:pre">		</span>echo $array[$i]."  ";
<span style="white-space:pre">	</span>}
?>
显示结果:

5 9 18 26 37 42 66 88 
88 66 42 37 26 18 9 5

3. 使用ksort()和asort()对关联数组排序,如果使用了相关数组,在排序后还要保持关键字和值的排序一致,这是就需要使用ksort()和asort()函数
<p class="p1"><?php</p><p class="p1"><span style="white-space:pre">	</span>$array=array('php'=>1,'jsp'=>2,'asp'=>3);</p><p class="p1"><span style="white-space:pre">	</span>ksort($array);</p><p class="p1"><span style="white-space:pre">	</span>print_r($array);</p><p class="p1"><span style="white-space:pre">	</span>echo "<br>";</p><p class="p1"><span style="white-space:pre">	</span>asort($array);</p><p class="p1"><span style="white-space:pre">	</span>print_r($array);</p><p class="p1">?></p>
显示结果:

Array ( [asp] => 3 [jsp] => 2 [php] => 1 ) 
Array ( [php] => 1 [jsp] => 2 [asp] => 3 )

注意:使用ksort()和asort()以升序对关联数组排序,同样使用krsort()和arsort()以降序对关联数组排序


4. 查询数组中指定的元素

说明:array_search()函数,在数组中搜索给定的值,找到后返回键名,否则返回false。在PHP4.2之前函数在失败时返回null而不是false。

格式:mixed array_search(mixed needle, array haystack [, bool strict)

参数说明:needle必要参数搜索的值。如果 needle 是字符串,则比较以区分大小写的方式进行。haystack必要参数,操作数组。strict可选参数,如果设为 TRUE,则 array_search() 将在 haystack 中检查完全相同的元素。 这意味着同样检查 haystack 里 needle 的 类型,并且对象需是同一个实例。

返回值:如果找到了 needle 则返回它的键,否则返回 FALSE。如果 needle 在 haystack 中出现不止一次,则返回第一个匹配的键。要返回所有匹配值的键,应该用 array_keys()加上可选参数 search_value 来代替。

注意: 此函数可能返回布尔值 FALSE,但也可能返回等同于 FALSE 的非布尔值。应使用 === 运算符来测试此函数的返回值。


5. 获取数组最后一个元素

说明:array_pop() 弹出并返回 array 数组的最后一个单元,并将数组 array 的长度减一。如果 array 为空(或者不是数组)将返回 NULL。 此外如果被调用不是一个数则会产生一个 Warning。

格式:mixed array_pop ( array &$array )

参数说明:array必要参数,需要做出栈的数组。

返回值:返回 array 的最后一个值。如果 array 是空(如果不是一个数组),将会返回 NULL 。

<?php
$stack = array("orange", "banana", "apple", "raspberry");
$fruit = array_pop($stack);
print_r($stack);
?>
显示结果:

Array ([0] => orange[1] => banana[2] => apple)

6. 向数组中添加元素

说明:array_push() 将 array 当成一个栈,并将传入的变量压入 array 的末尾。array 的长度将根据入栈变量的数目增加

格式:int array_push ( array &$array , mixed $var [, mixed $... ] )

参数介绍:array输入的数组。var要压入的值。

返回值:返回处理之后数组的元素个数。

等同于:如果var是数组类型,遍历var,对var内的所有元素执行如下语句

<?php
<span style="white-space:pre">	</span>$array[] = $var;
?>
例子:

<?php
$stack = array("orange", "banana");
array_push($stack, "apple", "raspberry");
print_r($stack);
?>

显示结果:

Array([0] => orange[1] => banana[2] => apple[3] => raspberry)

注意:如果用 array_push() 来给数组增加一个单元,还不如用 $array[] = ,因为这样没有调用函数的额外负担。如果第一个参数不是数组,array_push() 将发出一条警告。这和 $var[] 的行为不同,后者会新建一个数组。


7. 删除数组中重复元素

说明:array_unique()函数用来删除数组中重复的元素。将值作为字符串排序,然后对每个值只保留第一个键名,忽略所有后面的键名,即删除数组中重复的元素。

格式:array array_unique(array array)

参数介绍:array必要参数,操作数组。

<?php
$input = array("a" => "green", "red", "b" => "green", "blue", "red");
$result = array_unique($input);
print_r($result);
?>
显示结果:

Array([a] => green[0] => red[1] => blue)


8. 删除数组中的元素

说明:unset() 函数允许删除数组中的某个键。但要注意数组将不会重建索引。如果需要删除后重建索引,可以用array_values() 函数。

格式:void unset ( mixed $var [, mixed $... ] )

参数说明:array必要参数,操作数组。

<?php
// 创建一个简单的数组
$array = array(1, 2, 3, 4, 5);
print_r($array);
// 现在删除其中的所有元素,但保持数组本身不变:
foreach ($array as $i => $value) {
unset($array[$i]);
}
print_r($array);
// 添加一个单元(注意新的键名是 5,而不是你可能以为的 0)
$array[] = 6;
print_r($array);
// 重新索引;
$array = array_values($array);
$array[] = 7;
print_r($array);
?>
显示结果:

Array([0] => 1[1] => 2[2] => 3[3] => 4[4] => 5)
Array()
Array([5] => 6)
Array([0] => 6[1] => 7)


php手册地址:http://php.net/manual/zh/


  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值