5️⃣
Array
(数组):PHP中的数组实际上是一个有序映射。映射是一种把 values , 关联到 keys 的类型。 此类型在很多方面做了优化,因此可以把它当成真正的数组,或列表(向量),散列表(映射的一种实现), 字典, 集合, 栈, 队列以及更多可能性。由于数组的元素的值可以是另一个数组,树形结构和多维数组也是允许的
-
(一) 定义数组:
可以使用
array()
语言结构来新建一个数组,它接受任意数量用逗号分隔的键
(key
) =>值
(value
) 对。
example1.php
//数组的声明:
$array1 = array('key' => 'value');
$array2 = ['name' => 'monkey']; //PHP5.4 以后可以使用 [],来声明数组;
注意:
- 键(key) 可以是一个整数(
integer
) 类型,也可以是字符串 (string
) 类型;- 值(
value
) 可以是任意类型的值;- 键(
key
)会有以下的强制转换:
- 包含合法整型值得字符串会被转换为整型。例如:键名
"8"
实际会被存储为8
。但是"08"
则不会强制准换,因为其不是一个合法的十进制数值;- 浮点数也会被转换成为整型,意味着其小数部分会被舍去。例如:键名
"8.7"
实际会被储存为8
;- 布尔值也会被转换成整型。即键名
true
实际会被存储为1
,false
会被存储为0
;null
会被转换成空字符串 。 即键名会被转换成''
;- 数组和对象不能用作键名。会导致警告错误
Illegal offset type
;
如果在数组定义中多个单元都使用了同一个键名,则只使用了最后一个,之前的都被覆盖了;
example2.php
//类型强制转换与覆盖
<?php
$array = array(
1 => "a",
"1" => "b",
1.5 => "c",
true => "d",
);
var_dump($array);
/**
运行结果是:
array(1) {
[1]=>
string(1) "d"
}
**
?>
php数组可以同时含有
integer
和string
类型的键名,因为PHP实际并不区分索引数组和关联数组。
如果对给出的值没有指定键名,则取出当前最大的整数索引值,而新的键名将是该值加一。如果指定的键名已经有了值,则该值会被覆盖;
example3.php
//混合 integer 和 string 的键名
$array = array(
"foo" => "bar",
"bar" => "foo",
100 => -100,
-100 => 100,
);
var_dump($array);
/**
以上会输出:
array(4) {
["foo"]=>
string(3) "bar"
["bar"]=>
string(3) "foo"
[100]=>
int(-100)
[-100]=>
int(100)
}
key
是可选项,如果未指定。PHP将自动使用之前用过的最大integer
键+1
作为新的键名;
example4.php
//没有键名的索引数组
<?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"
}
**/
可以只对某些单元指定键名,其他的不指定键名;
example5.php
<?php
$array = array(
"a",
"b",
6 => "c",
"d",
);
var_dump($array);
/**
以上会输出:
array(4) {
[0]=>
string(1) "a"
[1]=>
string(1) "b"
[6]=>
string(1) "c"
[7]=>
string(1) "d"
}
**/
最后一个值
d
被自动赋予键名7
, 是因为之前最大的整数键名是6
;
-
访问数组单元:
可以使用
[]
的语法来访问数组中的单元;
example6.php
<?php
$array = array(
"foo" => "bar",
42 => 24,
"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"
**/
注意:方括号
[]
和花括号{}
可以互换使用来访问数组单元, (例如:$array[43]
和$array{43}
在上实例中效果相同
);
- 使用方括号的语法 新建 / 修改 数组:
可以通过明示的设定其中的值来修改一个已有的数组;
这是通过在方括号内指定键名来给数组赋值实现的。也可以省略键名,在这种情况下给变量名加上一对空的方括号[]
;
$arr[key] = value;
$arr[] = value;
// key 可以是 integer 或 string
// value 可以是任意类型的值
如果
$arr
还不存在,则会新建一个。
要修改某个值,通过其键名给该单元赋一个新值。要删除某键值对,对其调用unset()
函数;
此处暂不细说数组操作函数,后期详细说明;
example7.php
<?php
$arr = array(5 => 1, 12 => 2);
$arr[] = 56; // 增加一个键名是 13 的单元 $arr[13] = 56;
$arr["x"] = 42; // 增加一个 键名是 "x" 的单元
unset($arr[5]); // 删除掉 $arr 数组中 键名是 5 的单元
unset($arr); // 删除整个数组 $arr
?>
如果给出方括号但没有指定键名,则取当前最大整数索引值,新的键名将是该值
+ 1
(但是最小为 0)。如果当前还没有整数索引,则键名将为0
。
注意:这里所使用的最大整数键名
不一定
就在当前数组中。它只要在上次数组重新生成索引后,曾经存在过就行了;(有点绕,看示例);
example8.php
<?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
)
理论听着可能比较绕,但容易理解;
注意:强烈不建议
$arrp[bar]
这样写,而是要写成$arr['bar']
;注意数组中单元中使用""
或者''
;
- 这样是错的,但可以正常运行。那么为什么错了呢?原因是此代码中有一个未定义的常量(bar)而不是字符串('bar'-注意引号),而 PHP 可能会在以后定义此常量,不幸的是你的代码中有同样的名字。它能运行,是因为 PHP 自动将裸字符串(没有引号的字符串且不对应于任何已知符号)转换成一个其值为该裸字符串的正常字符串。例如,如果没有常量定义为 bar,PHP 将把它替代为 'bar' 并使用之。
- 也许有一天,PHP 开发小组可能会想新增一个常量或者关键字,或者用户可能希望以后在自己的程序中引入新的常量,那就有麻烦了。例如已经不能这样用 empty 和 default 这两个词了,因为他们是
保留字
- 转换为数组:
- 对于任何类型
integer
,float
,boolean
,resource
类型,如果建一个值转换成数组,将得到一个仅有一个元素的数组,其键名是0
,该元素即为此标量的值。(array)$scalarValue
与array($scalarValue)
完全一样。- 如果一个
object
类型转换成一个array
类型,则结果为一个数组,其单元为该对象的属性。键名将为成员变量名,不过有几点例外:
- 整数属性不可访问;
- 私有变量前会加上类名作前缀;
- 保护变量前会加上一个
""
作前缀。这些前缀的前后都各有一个null
字符,这回导致一些不可预知的行为:
example9.php
<?php
class A {
private $A; // This will become '\0A\0A'
}
class B extends A {
private $A; // This will become '\0B\0A'
public $AA; // This will become 'AA'
}
var_dump((array) new B());
?>
/**
执行结果
array(3) {
["BA"]=>
NULL
["AA"]=>
NULL
["AA"]=>
NULL
}
**/
- 将 NULL 转换为
array
会得到一个空的数组。
6️⃣object
对象:
要创建一个对象
object
,需要使用new
语句来实例化;(后期详细说类和对象
);
转换成对象:
- 将一个对象转换成对象,它将不会有任何的变化;
- 如果其他任何类型的值转换成对象,将会创建一个内置类
stdClass
的实例。- 如果
null
转换成对象,则新实例为空;array
转换成object
将使用键名称为属性名并具有相对应的值,除了数字键,不迭代就无法被访问;
$obj = (object) array('1' => 'foo');
var_dump(isset($obj->{'1'})); // bool(false)
var_dump(key($obj)); // int(1)
对于其他值,会包含进成员变量名:
<?php
$obj = (object) 'ciao';
var_dump($obj);
/**
object(stdClass)#1 (1) {
["scalar"]=>
string(4) "ciao"
}
**/
echo $obj->scalar; // 输出 'ciao'
7️⃣ NULL
:
特殊的
NULL
值表示一个变量都没有。NULL
类型唯一可能的值就是null
;
以下情况变量会被认为是 NULL
:
- 被赋值为
NULL
;- 为声明的变量;
- 被
unset()
的变量;
- 语法:
NULL
类型只有一个值,就是不区分大小写的常量NULL
;
- 转换到
NULL
:
使用
unset
函数将一个变量转换成NULL
, 将不会删除该变量或unset
其值。仅是返回NULL
而已;
8️⃣ resource
资源:
资源是以一个特殊的变量,保存了到外部资源的一个引用。资源是通过专门的函数来建立和使用的。
以后说资源的相关函数及其相应资源类型;
转换为资源:
由于资源类型变量保存有为打开文件、数据库连接、图形画布区域等的特殊句柄,因此将其它类型的值转换为资源没有意义。
以上就是 PHP数组类型
的全部内容,欢迎纠错和补充,感谢!!!
相关题目:
<?php
//写出PHP的超全局变量(数组),并解释每个的含义;
?>