【PHP】解析PHP中的数组
目录结构:
在这篇文章中,笔者将会介绍PHP中数组的使用,以及一些注意事项。之前笔者已经说过PHP是一门弱语言类型,因此php中的数组使用也比较灵活。
1.创建数组
创建数组的方式有好几种,比如:
<?php //格式: //$数组变量名[索引值]=资料内容 $foos[0] = "hello "; $foos[1] = "world "; //格式: //array( [key =>] value , ... ) //key 可以是 integer 或者 string。value 可以是任意类型。 $foos = array(prefix => "hello ",suffix => "world "); $foos = array(0 => "hello ",suffix => "world "); //也可以不用指定键(key) $foos = array("hello ","world "); //创建多维数组 //格式: //array( // array(...), // array(...), // array(...), // ...); //下面创建一个2行,第一行为1,2,3,4,5,6,第二行为1,2,3,4,5,6,7的二维数组。 $flat = array( row1 => array(1,2,3,4,5,6), row2 => array(1,2,3,4,5,6,7) ); ?>
在使用array(...)的形式创建数组时,其中key会有如下的强制转化要求:
1.包含有合法整型值的字符串会被转换为整型。例如键名 "8" 实际会被储存为 8。但是 "08" 则不会强制转换,因为其不是一个合法的十进制数值。
2.浮点数会被转换为整型,意味着其小数部分会被舍去。例如键名 8.7 实际会被储存为 8。
3.布尔值会被转换成整型。即键名 true 实际会被储存为 1 而键名 false 会被储存为 0。
4.Null 会被转换为空字符串,即键名 null 实际会被储存为 ""。
5.数组和对象不能被用为键名。坚持这么做会导致警告:Illegal offset type。
除此之外使用array(...)定义数组还有如下特性:
1.如果对给出的值没有指定键名,则取当前最大的整数索引值,而新的键名将是该值加一。如果指定的键名已经有了值,则该值会被覆盖.
2.如果在数组定义中多个单元都使用了同一个键名,则只使用了最后一个,之前的都被覆盖了。
2.删除数组
PHP中允许删除整个数组,同时也允许删除某一个键/值对。
比如:
<?php echo "begin\n"; $foos = array("how","are","you"); echo("counts = ".count($foos)."\n"); foreach ($foos as $f){ echo($f."\n"); } unset($foos); echo("counts = ".count($foos)."\n"); for($i = 0; $i <= count($foos); $i++){ echo($foos[$i]."\n"); } echo("finish\n"); ?>
输出结果为:
begin
counts = 3
how
are
you
counts = 0
finish
上面展示了在删除整个数组后,数组的数量就变成0了。接下笔者将会演示只删除其中某一个键/值对,以及需要注意的地方。
<?php $arr = array("how","are","you"); print_r($arr); print("----------------\n"); //清除键为1的键/值对 unset($arr[1]); print_r($arr); ?>
输出结果如下:
Array
(
[0] => how
[1] => are
[2] => you
)
----------------
Array
(
[0] => how
[2] => you
)
通过这个结果可以看出,当使用unset()删除其中某一个键/值对时候,其余的键不会自动调整编号。非常容易理解这种设计,因为array本质上就是按照键/值对进行存储的,删除其中一对键/值对,就改变其他键/值对的话,肯定不符合常理,并且有些键更本就不能按照数值大小(字符串)排序。那么有没有一种常规的排序方法,能够在删除数组中的某一键/值对后,只把以数值为键的键值对从0升序排列呢?答案是肯定的,array_multisort(...)就能完成这样的功能。
<?php $arr = array("how","are","dot"=>",","you"); print_r($arr); print("----------------\n"); //清除键为1的键/值对 unset($arr[1]); array_multisort($arr); print_r($arr); ?>
输出结果:
Array
(
[0] => how
[1] => are
[dot] => ,
[2] => you
)
----------------
Array
(
[dot] => ,
[0] => how
[1] => you
)
通过输出结果可以看出,以字符串为键的键/值对保留了下来,以数值为键的键/值对被重新排序。
3.栈结构
上面说过,PHP中数组的使用非常灵活,同样可以用于模拟栈结构。栈结构具有“先进后出”的特点。数组中提供了array_push和array_pop方法。
array_push在尾部添加元素。
array_pop从尾部弹出一个元素。
例如:
<?php $arr = Array(); array_push($arr, "how"); print("push \"how\" into array\n"); array_push($arr, "are"); print("push \"are\" into array\n"); array_push($arr, "you"); print("push \"you\" into array\n"); print("------------------------\n"); print("pop \"".array_pop($arr)."\" from array\n"); print("pop \"".array_pop($arr)."\" from array\n"); print("pop \"".array_pop($arr)."\" from array\n"); ?>
输出结果为:
push "how" into array
push "are" into array
push "you" into array
------------------------
pop "you" from array
pop "are" from array
pop "how" from array
4.常用的数组处理函数
PHP中提供了许多数组处理函数,下面笔者列举一些常用的:
array each( array array) 返回 array 数组中当前指针位置的键/值对并向前移动数组指针
void list ( mixed ...) 通过一个操作给一组变量赋值
array_shift 将数组开头的单元移出数组
array_unshift 在数组开头插入一个或多个单元
array_combine 创建一个数组,用一个数组的值作为其键名,另一个数组的值作为其值
array_merge 合并一个或多个数组
array_splice 把数组中的一部分去掉并用其它值取代
参考文章: