首页 » PHP » PHP - 数组

PHP数组基础

PHP的数组实质是有序map,即一个键值对。可以把PHP array视作C的数组,list/vector,hash table、字典、集合、堆、栈等许多数据结构。数组中可以包含任意类型,特别地,可以构成多维数组。对数组的操作都是以函数形式进行,而非STL的对象方法操作。

数组的语法。构建数组:

$arr = array($v1, $v2);
$arr = array($k1 => $v1, $k2 => $v);

自PHP 5.4起,可以用[]的语法来代替array(),例如:

$arr = [$v, $v2];
$arr = [$k1 => $v1, $k2 => $v2];

对关联数组而言,最后一个key/value的逗号是可选的,写了也没错:

$arr = array(
    $k1 => $v1,
    $ke => $v2,
);

在PHP中,普通数组(indexed array)和关联数组(associative array)的界限非常模糊,甚至可以混杂着使用:

$arr = array(2,9,3,4,10,8,3);
foreach($arr as $v) {
    echo "$v - ";
}
echo "\n";
foreach($arr as $k => $v) {
    echo "$k,$v - ";
}
echo "\n";

输出:

2 - 9 - 3 - 4 - 10 - 8 - 3 - 
0,2 - 1,9 - 2,3 - 3,4 - 4,10 - 5,8 - 6,3 - 

一个更复杂的例子

$arr = array(1 => "Washington", "Adams", "Honest" => "Lincoln", "Jefferson");
var_dump($arr);

以上,指定了数组的下标从1开始(可以指定数组小标从任意数字开始),并且混合了普通数组和关联数组,它的输出是:

array(4) {
  [1]=>                      // key是1
  string(10) "Washington"
  [2]=>                      // key是1+1(2)
  string(5) "Adams"
  ["Honest"]=>               // key是字符串 Honest
  string(7) "Lincoln"
  [3]=>                      // key是2+1(3)
  string(9) "Jefferson"
}

PHP array的key值可以是int或string,value可以是任意类型。key在几种情况下会被自动转为int或string:

  • string - 如果string是合法的数字,则会被转为int。如"8"会被转为8,但"08"不会被转换。
  • float - 小数部分会被截断,如1.2会被转为1。
  • bool - 布尔值会转为0(false)或1(true)。
  • Null - 转为空字符串""。

PHP array的key可以是负数,如:

$arr = [-1 => "George II", "George III", "Washington"];

访问不存在的key,会引发错误,但可以用@消除,如:

$arr = ["hello", "world"];
$arr[0];        // hello
$arr[2];        // error, Undefined offset
@$arr[2];       // 出错,但不报错

将数组的元素抽取出来有几种方式。除了$arr[$idx]/$arr[$key]的方式,还可以使用list()抽取:

$arr = ["red", "large"];
list($color, $size) = $arr;

list()可以实现部分抽取,如:

rr = ["Nike", "red", "large"];
list($brand, ,$size) = $arr;

注意,list()的方式只对普通数组有效,关联数组无效。除list()而外,extract()和compact()也是2个常见的拆散/组合数组数据的函数。extract()将关联数组的数据抽取出来,所有的key都有一个对应的变量:

$data = ["username" => "berlinix", "location" => "Beijing"];
extract($data);
echo "$username, $location\n";  // output: berlinix, Beijing

compact()则将已有的变量,打包成为一个关联数组:

$color = "blue";
$size = "18cm";
$data = compact("color", "size");
print_r($data);     // $data = ["color" => "blue", "size" => "18cm"];

遍历/添加/删除元素

一旦array创建完毕,最常见的操作就是遍历/添加/删除元素这几个操作。

遍历元素:

$arr = [$v1, $v2];
foreach($arr as $elem) {
    // ...
}

$arr = [$k1 => $v1, $k2 => v2];
foreach($arr as $key => $val) {
    // ...
}

如果要在遍历array时修改元素,可以用 &$elem/&$val,如:

foreach($arr as &$elem) {}
foreach($arr as $key => &$val) {}

添加元素:

$arr []= $val;
array_push($arr, $val);

删除元素:

unset($arr[0]);
unset($arr[$key]);

在PHP的foreach中删除元素是安全的。注意即使是简单数组,在foreach中删除元素时也应该使用$k => $v的形式:

$arr = array(2,9,3,4,10,8,3);
foreach($arr as $k => $v) {
    if($v > 5) {
        unset($arr[$k]);
    }
}

分享

0