【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 把数组中的一部分去掉并用其它值取代
参考文章:
【PHP】解析PHP中的数组的更多相关文章
- 【java】解析java中的数组
目录结构: contents structure [+] 一维数组 1,什么是一维数组 2,声明一维数组的三种方式 二维数组 1,什么是二维数组 2,声明二维数组的3种方式 3,二维数组的遍历示例 数 ...
- 前端开发:Javascript中的数组,常用方法解析
前端开发:Javascript中的数组,常用方法解析 前言 Array是Javascript构成的一个重要的部分,它可以用来存储字符串.对象.函数.Number,它是非常强大的.因此深入了解Array ...
- 浅解析js中的对象
浅解析js中的对象 原文网址:http://www.cnblogs.com/foodoir/p/5971686.html,转载请注明出处. 前面的话: 说到对象,我首先想到的是每到过年过节见长辈的时候 ...
- 深度解析javascript中的浅复制和深复制
原文:深度解析javascript中的浅复制和深复制 在谈javascript的浅复制和深复制之前,我们有必要在来讨论下js的数据类型.我们都知道有Number,Boolean,String,Null ...
- 解析jQuery中extend方法--源码解析以及递归的过程《二》
源码解析 在解析代码之前,首先要了解extend函数要解决什么问题,以及传入不同的参数,会达到怎样的效果.extend函数内部处理传入的不同参数,返回处理后的对象. extend函数用来扩展对象,增加 ...
- 【PHP】最详细PHP从入门到精通(三)——PHP中的数组
PHP从入门到精通 之PHP中的数组 各位开发者朋友大家好,链接上次更新,我们PHP的学习也更深了一层,本次博主给大家带来PHP数组的数组实例详解的相关资料.数组分为数组数值数值,关联数组,多维数组 ...
- Gson全解析(中)-TypeAdapter的使用
TypeAdapter介绍 前面的Gson全解析(上)中我们理解并分别运用了JsonSerializer和JsonDeserializer进行JSON和java实体类之间的相互转化.这里利用TypeA ...
- 使用具体解释及源代码解析Android中的Adapter、BaseAdapter、ArrayAdapter、SimpleAdapter和SimpleCursorAdapter
Adapter相当于一个数据源,能够给AdapterView提供数据.并依据数据创建相应的UI.能够通过调用AdapterView的setAdapter方法使得AdapterView将Adapter作 ...
- 深度解析VC中的消息(转发)
http://blog.csdn.net/chenlycly/article/details/7586067 这篇转发的文章总结的比较好,但是没有告诉我为什么ON_MESSAGE的返回值必须是LRES ...
随机推荐
- datatables数据渲染自定义
"data": "ip",渲染回调函数中的data['ip']字段将传给render函数中的data:render函数的返回内容将代替"data&qu ...
- Ef 自动迁移,日志
Ef 迁移 在vs打开程序控制台 2,选择程序集 ,如果是初次,输入 Enable-Migrations,启动迁徙 3 添加迁移,完成修改 4,之后会自动生成迁移配置文件. 然后再上下文类中加入 两 ...
- Linux上的文件查找工具之locate与find
前言 Linux上提供了两款工具用于查找文件,一款是locate,另一款是find. locate的特点是根据已生成的数据库查找,速度较快,但是查找的是快照数据,不准确. 因此在日常使用中,为了准确性 ...
- RFC2616-HTTP1.1-Header Field Definitions(头字段规定部分—单词注释版)
part of Hypertext Transfer Protocol -- HTTP/1.1RFC 2616 Fielding, et al. 14 Header Field Definitions ...
- 自己总结的C#编码规范--6.格式篇
格式 格式的统一使用可以使代码清晰.美观.方便阅读.为了不影响编码效率,在此只作如下规定: 长度 一个文件最好不要超过500行(除IDE自动生成的类). 一个文件必须只有一个命名空间,严禁将多个命名空 ...
- sql去除重复列(行)
1.存在两条完全相同的纪录 这是最简单的一种情况,用关键字distinct就可以去掉 例子: select distinct * from table(表名) where (条件) 2.存 ...
- C# virtual、abstract
(1) virtual:修饰的方法必须有实现 abstract:修饰的方法一定不能实现 (2) virtual:可被子类重写, 子类中必须用overide修饰 abstract:必须被子类重写 (3) ...
- BZOJ3537 : [Usaco2014 Open]Code Breaking
考虑容斥,枚举哪些串必然出现,那么贡献为$(-1)^{选中的串数}$. 设$f[i][j]$表示$i$的子树内,$i$点往上是$j$这个串的贡献之和,那么总状态数为$O(n+m)$,用map存储$f$ ...
- 使用Three.js为QQ用户生成3D头像阵列
东西其实比较简单,就是输出某一范围内QQ账号的3D头像 涉及的技术主要是Three.js的基本使用 而后通过腾讯的接口异步并发请求QQ用户头像,Canavs作图生成Texture应用在球体上 需要注意 ...
- Android 中的设计模式
1.单例模式 ContentProvider是单例模式,多个ContentResolver操作的都是同一个ContentProvider.