Take a look at GW

【PHP】解析PHP中的数组

目录结构:

contents structure [-]

在这篇文章中,笔者将会介绍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 把数组中的一部分去掉并用其它值取代

参考文章:

http://php.net/

posted @ 2018-12-29 11:41  HDWK  阅读(1809)  评论(0编辑  收藏  举报