关于PHP的数据类型(三)

数据类型

5️⃣Array (数组):
PHP中的数组实际上是一个有序映射。映射是一种把 values , 关联到 keys 的类型。 此类型在很多方面做了优化,因此可以把它当成真正的数组,或列表(向量),散列表(映射的一种实现), 字典, 集合, 栈, 队列以及更多可能性。由于数组的元素的值可以是另一个数组,树形结构和多维数组也是允许的

  • (一) 定义数组:

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

example1.php

//数组的声明:
$array1 = array('key' => 'value');
$array2 = ['name' => 'monkey']; //PHP5.4 以后可以使用 [],来声明数组;

注意

  • 键(key) 可以是一个整数(integer) 类型,也可以是字符串 (string) 类型;
  • 值(value) 可以是任意类型的值;
  • 键( key)会有以下的强制转换:
  1. 包含合法整型值得字符串会被转换为整型。例如:键名 "8" 实际会被存储为 8。但是 "08" 则不会强制准换,因为其不是一个合法的十进制数值;
  2. 浮点数也会被转换成为整型,意味着其小数部分会被舍去。例如:键名 "8.7" 实际会被储存为 8;
  3. 布尔值也会被转换成整型。即键名 true 实际会被存储为 1, false 会被存储为 0;
  4. null 会被转换成空字符串 。 即键名会被转换成 ''
  5. 数组和对象不能用作键名。会导致警告错误 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数组可以同时含有 integerstring 类型的键名,因为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 开发小组可能会想新增一个常量或者关键字,或者用户可能希望以后在自己的程序中引入新的常量,那就有麻烦了。例如已经不能这样用 emptydefault 这两个词了,因为他们是保留字
  • 转换为数组:
  • 对于任何类型 integer , float , boolean, resource 类型,如果建一个值转换成数组,将得到一个仅有一个元素的数组,其键名是 0 ,该元素即为此标量的值。
  • (array)$scalarValuearray($scalarValue)完全一样。
  • 如果一个 object 类型转换成一个 array 类型,则结果为一个数组,其单元为该对象的属性。键名将为成员变量名,不过有几点例外:
  1. 整数属性不可访问;
  2. 私有变量前会加上类名作前缀;
  3. 保护变量前会加上一个 "" 作前缀。这些前缀的前后都各有一个 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的超全局变量(数组),并解释每个的含义;
?>
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,948评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,371评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,490评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,521评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,627评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,842评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,997评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,741评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,203评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,534评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,673评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,339评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,955评论 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,770评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,000评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,394评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,562评论 2 349

推荐阅读更多精彩内容