php中的数组

简介

php中的数组每个元素都是一个"键-值"对,默认情况下数组内第一个元素的键为数值0,第二个元素键为数值1,依此类推,不过,php中的数组是可以为元素指定键的。应注意是,键的类型只能是整数或字符串,不能取其他类型。

php中,数组的定义相当自由,不仅键的数据类型不需要统一,值的数据类型也不需要统一,甚至维度都不需要统一:

$a['a'] = true;
$a[2] = 3;
$a[1]['b'] = "abc";

echo var_dump($a['a']);      // bool(true)
echo var_dump($a[2]);        // int(3)
echo var_dump($a[1]['b']);   // string(3) "abc"


数组定义

要定义一个数组,实际上不需要什么特殊的语法,直接定义有一个具有下标的变量并对其赋值就可以了,例如:

$arr[3] = 4;

此外,还可以使用array()函数(及简写的方括号)进行定义:

$a = array();
$b = array('x1', 'x2');
$c = array(1=>'x1', 'a2'=>'x2', 3=>'x3');
$d = [];
$e = ['x1', 'x2'];
$f = [1=>'x1', 'a2'=>'x2', 3=>'x3'];

echo var_dump($a);
echo var_dump($b);
echo var_dump($c);
echo var_dump($d);
echo var_dump($e);
echo var_dump($f);
-----------------
array(0) {
}
array(2) {
  [0]=>
  string(2) "x1"
  [1]=>
  string(2) "x2"
}
array(3) {
  [1]=>
  string(2) "x1"
  ["a2"]=>
  string(2) "x2"
  [3]=>
  string(2) "x3"
}
array(0) {
}
array(2) {
  [0]=>
  string(2) "x1"
  [1]=>
  string(2) "x2"
}
array(3) {
  [1]=>
  string(2) "x1"
  ["a2"]=>
  string(2) "x2"
  [3]=>
  string(2) "x3"
}


$a[2]['a'] = 'sa';
$a[2]['b'] = 'sb';
$a[3] = 4;
$b = array(array(1,2,3), array(4,5,6));  // 也可以使用=>运算符指定键名
$c = [[1,5=>2,3],[3=>4,5,6]];             // 注意键名的自动分配

echo var_dump($a);
echo var_dump($b);
echo var_dump($c);
--------------------
array(2) {
  [2]=>
  array(2) {
    ["a"]=>
    string(2) "sa"
    ["b"]=>
    string(2) "sb"
  }
  [3]=>
  int(4)
}
array(2) {
  [0]=>
  array(3) {
    [0]=>
    int(1)
    [1]=>
    int(2)
    [2]=>
    int(3)
  }
  [1]=>
  array(3) {
    [0]=>
    int(4)
    [1]=>
    int(5)
    [2]=>
    int(6)
  }
}
array(2) {
  [0]=>
  array(3) {
    [0]=>
    int(1)
    [5]=>
    int(2)
    [6]=>
    int(3)
  }
  [1]=>
  array(3) {
    [3]=>
    int(4)
    [4]=>
    int(5)
    [5]=>
    int(6)
  }

}

注意,php中数组元素的类型是不需要统一的,在本例中,数组$a的元素$a[2]是一个数组,具有['a']和['b']两个元素,而$a[3]只是一个整数。


数组的键

数组的键可以是常量或变量:

$a = 'x1';
$b[$a] = 3;

echo var_dump($b['x1']);     // int(3)

数组的键只能是整数(包括正数、0和负数)或字符串类型,如果是其他类型,会以以下规则自动进行转换:

1.包含有合法整型值的字符串会被转换为整型。例如键名 "8" 实际会被储存为 8。但是 "08" 则不会强制转换,因为其不是一个合法的十进制数值。  这也意味着键1和键"1"是不能共存的,尽管键支持整数和字符串类型。

2.浮点数也会被转换为整型。

3.布尔值也会被转换成整型。true转换为1,false转换为0。 

4.null 转换为 ""。 

5.数组和对象不能被用为键名。

$a = [1=>2, '1'=>4, 'a'=>'x', false=>'y', null=>'z'];
echo var_dump($a);
---------------------
array(4) {
  [1]=>
  int(4)
  ["a"]=>
  string(1) "x"
  [0]=>
  string(1) "y"
  [""]=>
  string(1) "z"
}

$a = [1,2,5=>3,4];
var_export($a);
--------------------

array (
  0 => 1,
  1 => 2,
  5 => 3,
  6 => 4,
)


给数组元素赋值

如果给元素赋了值但没有给元素的键赋值时,例如"arr[] = 100;",那么默认的键为数组内最大的整数键加1,如果数组内没有正整数的键,那么默认的键为0。注意这里所使用的最大整数键名不一定当前就在数组中。它只要在上次数组重新生成索引后曾经存在过就行了。以下面的例子来说明:

$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
)

可见,重新索引后,原来键为5的值6,现在变成键0了。此外,除了中括号[]之外,也可以使用花括号{}来存取数组的元素。


如果使用下标对一个变量赋值,将会发生以下情况:

1.如果变量未定义,则定义此变量,类型为数组

2.如果变量已定义,且为数组,则向此数组修改或添加元素

3.如果变量已定义,但不是数组,则无效果

$a = "abc";
$b = ["abc"];
$a[2] = "def";
$b[2] = "def";

var_dump($a);
var_dump($b);
--------------------
string(3) "abd"
array(2) {
  [0]=>
  string(3) "abc"
  [2]=>
  string(3) "def"
}


将数组元素依次赋给一组变量

可通过list()函数便捷地将一组数组元素赋给一组变量

$a = array(1,2,3,4,5,6);
list(,,,$x,$y) = $a;
var_dump($x);   // int(4)
var_dump($y);   // int(5)


删除数组元素

数组元素可通过unset()函数从数组中移除

但unset()函数只是删除数组元素,并不会重建索引。如果需要删除后重建索引,可以再调用一次 array_values() 函数

$a[0] = 1;
$a[1] = 2;
$a[2] = 3;
unset($a[1]);
var_dump($a);
---------------------
array(2) {
  [0]=>
  int(1)
  [2]=>
  int(3)
}


常数数组

define()函数可用于定义常数数组,例如:

define('ARR', [1,2,'a']);
echo var_dump(ARR);
array(3) {
  [0]=>
  int(1)
  [1]=>
  int(2)
  [2]=>
  string(1) "a"
}

类中同样可以使用const来定义常量数组:

class foo
{
  public const str = [1,2,3];
}
echo foo::str[0];

运算符

数组支持的运算符包括:

+、==、===、!=、<>、!==、+=


数组加法(+)

数组的加法运算将得到一个新的数组,新数组的键值为各操作数数组的键值的并集。对于同名键值,以收集到的第一个元素为有效。也就是右边的数组元素附加到左边的数组后面,两个数组中都有的键名,则只用左边数组中的,右边的被忽略。

$a = array(1, 2);
$b = array(3, 4, 5, 6);
$c = array(7, 8, 9);
$d = ($a + $b + $c);
var_dump($d);
--------------------

array(4) {
  [0]=>
  int(1)
  [1]=>
  int(2)
  [2]=>
  int(5)
  [3]=>
  int(6)
}


$a = array('a'=>1, 2);
$b = array(3, 4, 5, 6);
$c = array(7, 8, 'b'=>9);
$d = ($a + $b + $c);
var_dump($d);
--------------------
array(6) {
  ["a"]=>
  int(1)
  [0]=>
  int(2)
  [1]=>
  int(4)
  [2]=>
  int(5)
  [3]=>
  int(6)
  ["b"]=>
  int(9)
}


相等运算符(==),两个数组有相同的元素(键和值)时,结果为true

全等运算符(===),两个数组有相同的元素且顺序相同、类型也相同时结果为true

$a = array(0=>1, 1=>2);
$b = array(1=>2, 0=>1);
$c = array(1, 2);

var_dump($a == $b);   // true
var_dump($a === $b);  // false
var_dump($a == $c);   // true
var_dump($a === $c);  // true

不等运算符包括!=和<>,两者作用相同。





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值