热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

php5从数组取值,5.数组·ThinkPHP5从入门到努力之入门实践·看云

[TOC]#数组的概述PHP中的数组实际上是一个有序图。图是一种把values映射到keys的类型。此类型在很多方面做了优化,因此可以把它当成真正的数组来使用

[TOC]

# 数组的概述

PHP 中的数组实际上是一个有序图。图是一种把 values 映射到 keys 的类型。此类型在很多方面做了优化,因此可以把它当成真正的数组来使用,或列表(矢量),散列表(是图的一种实现),字典,集合,栈,队列以及更多可能性。因为可以用另一个 PHP 数组作为值,也可以很容易地模拟树。

所谓的 *数组下标* 可以视为资料内容在此数组中的识别名称,通常被称为数组下标。

当索引值为数值时,也代表此资料内容在数组中的储存位置。

数组中有几个索引值就被称为几维数组。

> 数组分类:

在PHP中有两种数组:**索引数组**和**关联数组**。

索引(indexed)数组的索引值是整数,以0开始。当通过位置来标识东西时用索引数组。

关联(associative)数组以字符串做为索引值,关联数组更像操作表。索引值为列名,用于访问列的数据。

#数组的定义

###### 1 直接赋值的方式声明数组

数组常用的赋值方式:

由于 PHP 是属于弱类型数据,因此源代码中的数组并不需要经过特别的声明操作,直接将一组数值指定给某一数组元素即可。一般情况下数组的赋值有两种方式:

* 直接赋值方式 如:

`$a[0]='spam@126.com'; `

`$a[1]='abuse@sohu.com';`

* 使用array函数 如:

`$a=array('spam@126.com','abuse@sohu.com');`

直接赋值格式:

```

$数组变量名[索引值]=资料内容

```

其中索引值(下标)可以是一个字符串或一个整数。等价于整数(不以0开头)的字符串值被当作整数对待。因此,数组$array[3]与$array[‘3’]是引用相同的元素。但是$array[‘03’]引用的另外不同的元素。

一维数组

数组中索引值(下标)只有一个的数组称为一维数组。在数组中这是最简单的,也是最常用的了。

实例1:

```

$a[0]=1;

$a[1]=2;

$a[2]=3;

$b[]=1;

$b[]=2;

$b[]=3;

$b[6]=4;

$b[]=5;

?>

```

实例2:

```

$a["name"]="zhang";

$a["sex"]="man";

$a["age"]=23;

$b["name"]="lisi";

$b[]="woman";

$b["age"]=28;

$b[8]=4;

$b[]=5;

?>

```

###### 2 使用array( )语言结构新建数组

格式:

```

array( [key =>] value , ... )

// key 可以是 integer 或者 string

// value 可以是任何值

```

key 可以是 integer 或者 string。如果键名是一个 integer 的标准表达方法,则被解释为整数(例如 “8” 将被解释为 8,而 “08” 将被解释为 “08”)。key 中的浮点数被取整为 integer。PHP 中没有不同的数字下标和关联下标数组,数组的类型只有一种,它可以同时包含整型和字符串型的下标。

如果对给出的值没有指定键名,则取当前最大的整数索引值,而新的键名将是该值加一。如果指定的键名已经有了值,则该值会被覆盖。

实例:

```

$a=array(1,2,3,4,5,6);

$b=array("one", "two", "three");

$c=array(0=>"aaa",1=>"bbb",2=>"ccc");

$d=array("aaa",6=>"bbb","ccc");

$e=array("name"=>"zhang", "age"=>20);

?>

```

###### 3 多维数组的声明

多维数组的声明方式及规则,与一维数组相同,例如:下面二维数组的声明片段:

```

$a[0] = 0;

$a[0] = 1;

$a['string'][0] = 'Zero';

$a['string'][1] = 'One';

?>

```

如果以 array 语法声明,则如下程序片段:

```

$a = array(

0=>array(0,1),

'string'=>array('Zero','One'),

);

?>

```

# 数组的遍历

###### 1 使用for语句循环遍历数组

```

$arr=array(1, 3, "for"=>4, 5, 6, 7, 8,9,10=>"aa",

"bb", "cc");

for($i=0; $i

echo "\$arr[".$i."]=".$arr[$i]."
";

}

?>

```

###### 2 使用foreach语句遍历数组

foreach循环结构:

foreach 仅用于数组,有两种语法。

```

foreach ($arr as $value) {

}

foreach ($arr as $key => $value) {

}

```

第一种格式遍历给定的 array_expression 数组。每次循环中,当前单元的值被赋给 $value 并且数组内部的指针向前移一步

第二种格式做同样的事,只除了当前单元的键值也会在每次循环中被赋给变量 $key。

>注: 当 foreach 开始执行时,数组内部的指针会自动指向第一个单元。此外注意foreach 所操作的是指定数组的一个拷贝,而不是该数组本身。

```

$a=array(10,20,30,40,50,60);

foreach($a as $k=>$v) {

echo "$k => $v
";

}

?>

```

###### 3 联合使用list( )、each( )和while循环遍历数组

```

array each ( array array)

```

返回 array 数组中当前指针位置的键/值对并向前移动数组指针。键值对被返回为四个单元的数组,键名为 0,1,key 和 value。单元 0 和 key 包含有数组单元的键名,1 和 value 包含有数据。

如果内部指针越过了数组的末端,则 each() 返回 FALSE。

each() 经常和list( ) 结合使用来遍历数组。

```

void list ( mixed ...)

```

它不是真正的函数,而是语言结构。list() 用一步操作给一组变量进行赋值。

> 注: list() 仅能用于数字索引的数组并假定数字索引从0开始。

在执行 each() 之后,数组指针将停留在数组中的下一个单元或者当碰到数组结尾时停留在最后一个单元。如果要再用 each 遍历数组,必须使用reset( )。

```

$fruit= array('a' => 'apple', 'b' => 'banana', 'c' => 'cranberry');

reset($fruit);

while (list($key, $val) = each($fruit)) {

echo "$key => $val\n";

}

$arr=array("one"=>"aaa", "two"=>"bbb", "three"=>"cccc");

while($sz=each($arr)){

//echo $sz[0]."===>".$sz[1]."
";

echo $sz["key"]."===>".$sz["value"]."
";

}

?>

```

###### 4 使用数组的内部指针控制函数遍历数组

数组指针的控制函数

由于数组是由多笔资料集合而成,所以当程序需要运算处理其中某个索引位置的资料内容时,会由数组之中内定的指针,指向目标资料,以提供程序作正确的读取。下面针对数组指针控制的相关函数,作简单的说明介绍:

next()、prev()、end()及 reset()

这四个函数可以控制目前数组中的指针位置。

* next()负责将指针向后移动

* prev()负责将指针向前移动

* end()会将指针指向数组中最后一个元素

* reset()函数则会将目前指针无条件移至第一个索引位置。

语法格式:

```

mixed next(数组名称);mixed prev(数组名称);

mixed end(数组名称);mixed reset(数组名称);

mixed current(数组名称); mixed key(数组名称);

```

# 预定义数组

```

1 服务器变量: $_SERVER

2 环境变量:$_ENV

3 HTTP GET变量:$_GET

4 HHTP POST变量:$_POST

5 request变量:$_REQUEST

6 HTTP文件上传变量:$_FILES

7 HTTP COOKIEs:$_COOKIE

8 Session变量:$_SESSION

9 Global变量:$GLOBALS

```

###### 服务器变量$_SERVER

是一个包含诸如头信息(header)、路径(path)和脚本位置(script locations)的数组。数组的实体由 web 服务器创建。不能保证所有的服务器都能产生所有的信息;服务器可能忽略了一些信息,或者产生了一些未在下面列出的新的信息。这是一个自动全局变量。这只不过意味这它在所有的脚本中都有效。在函数或方法中不需要使用 global $_SERVER;

`PHP_SELF` :当前正在执行脚本的文件名

`DOCUMENT_ROOT` :当前运行脚本所在的文档根目录

`REMOTE_ADDR` :正在浏览当前页面用户的 IP 地址。

在解析器运行时,这些变量从环境变量转变为 PHP 全局变量名称空间(namespace)。它们中的许多都是由 PHP 所运行的系统决定。完整的列表是不可能的。请查看系统的文档以确定其特定的环境变量。

这是一个自动全局变量。它在所有的脚本中都有效。在函数或方法中不需要使用 global $_ENV;

######环境变量:$_ENV

在解析器运行时,这些变量从环境变量转变为 PHP 全局变量名称空间(namespace)。它们中的许多都是由 PHP 所运行的系统决定。完整的列表是不可能的。请查看系统的文档以确定其特定的环境变量。

这是一个自动全局变量。它在所有的脚本中都有效。在函数或方法中不需要使用 global $_ENV;

###### HTTP GET变量:$_GET

通过 HTTP GET 方法传递的变量组成的数组。是自动全局变量.

http://localhost/login.php?name=zhangsan&id=100

```

echo “参数name的值:”.$_GET[“name”]; //zhangsan

echo “参数id的值:”.$_GET[“id”]; //100

?>

```

###### HTTP POST变量:$_POST

通过 HTTP POST 方法传递的变量组成的数组。是自动全局变量。

与$_GET相似,只是方法不一样。

###### request变量:$_REQUEST

此关联数组包含 $_GET,$_POST 和 $_COOKIE 中的全部内容。

###### HTTP文件上传变量:$_FILES

通过 HTTP POST 方法传递的已上传文件项目组成的数组。是自动全局变量。

###### HTTP COOKIEs:$_COOKIE

通过 HTTP COOKIEs 传递的变量组成的数组。是自动全局变量。

###### Session变量:$_SESSION

包含当前脚本中 session 变量的数组。参阅 Session 函数文档以获得更多信息。

###### Global变量:$GLOBALS

由所有已定义全局变量组成的数组。变量名就是该数组的索引。

# 数组的相关处理函数

###### 1 数组的键/值操作函数

`array_values` -- 返回数组中所有的值

```

格式:array array_values ( array input )

```

`array_keys` -- 返回数组中所有的键名

```

格式:array array_keys(array input[,mixed search_value [,bool strict]])

```

其中search_value为则只返回该值的键名

`in_array` -- 检查数组中是否存在某个值

```

格式:bool in_array(mixed needle,array haystack [, bool strict] )

```

其中strict参数:如果第三个参数 strict 的值为 TRUE 则函数还会检查needle的类型是否和haystack中类型相同

`array_flip` -- 交换数组中的键和值

```

格式:array array_flip ( array trans )

```

array_reverse --  返回一个单元顺序相反的数组

```

语法:array array_reverse ( array array [, bool preserve_keys] )

```

如果 preserve_keys 为 TRUE 则保留原来的键名

###### 2 统计数组元素的个数与唯一性

`count` -- 计算数组中的单元数目或对象中的属性个数

```

语法:int count ( mixed var [, int mode] )

```

如果可选的 mode 参数设为 COUNT_RECURSIVE(或 1),count() 将递归地对数组计数。

`array_count_values` -- 统计数组中所有的值出现的次数

```

语法:array array_count_values ( array input )

```

`array_unique` -- 移除数组中重复的值

```

语法:array array_unique ( array array )

```

###### 3 使用回调函数处理数组的函数

`array_filter` --  用回调函数过滤数组中的单元

```

语法:rray array_filter ( array input [, callback callback] )

```

依次将 input 数组中的每个值传递到 callback 函数。如果 callback 函数返回 TRUE,则 input 数组的当前值会被包含在返回的结果数组中。数组的键名保留不变。

> 如果没有提供 callback 函数,array_filter() 将删除 input 中所有等值为 FALSE 的条目。

`array_walk`--对数组中的每个成员应用用户函数

```

语法:bool array_walk ( array &array, callback funcname [, mixed userdata] )

```

* 如果成功则返回 TRUE,失败则返回 FALSE。

* 将用户自定义函数 funcname 应用到 array 数组中的每个单元。典型情况下 funcname 接受两个参数。array 参数的值作为第一个,键名作为第二个。如果提供了可选参数 userdata,将被作为第三个参数传递给 callback funcname。

* array_walk() 不会受到 array 内部数组指针的影响。array_walk() 会遍历整个数组而不管指针的位置。

`array_map` --  将回调函数作用到给定数组的单元上

```

语法: array array_map ( callback callback, array arr1 [, array ...] )

```

array_map() 返回一个数组,该数组包含了 arr1 中的所有单元经过 callback 作用过之后的单元。callback 接受的参数数目应该和传递给 array_map() 函数的数组数目一致。

###### 4 数组的排序函数

`sort` -- 对数组排序(升序)

`rsort` -- 对数组逆向排序(降序)

`usort` -- 使用用户自定义的比较函数对数组中的值进行排序

`asort` -- 对数组进行排序并保持索引关系(关联数组排序)

`arsort` -- 对数组进行逆向排序并保持索引关系

`uasort` -- 用户自定义的比较函数对数组进行排序并保持索引关联

`ksort` -- 对数组按照键名排序

`krsort` -- 对数组按照键名逆向排序

`uksort` -- 使用用户自定义的比较函数对数组中的键名进行排序

`natsort` -- 用“自然排序”算法对数组排序

`natcasesort` -- 用“自然排序”算法对数组不区分大小写字母排序

`array_multisort` -- 对多个数组或多维数组进行排序

###### 5 拆分、合并、分解与结合数组

`array_slice` -- 从数组中取出一段

```

语法: array array_slice ( array array, int offset [, int length [, bool preserve_keys]] )

```

* array_slice() 返回根据 offset 和 length 参数所指定的 array 数组中的一段序列。

* 如果 offset 非负,则序列将从 array 中的此偏移量开始。如果 offset 为负,则序列将从 array 中距离末端这么远的地方开始。

* 如果给出了 length 并且为正,则序列中将具有这么多的单元。如果给出了 length 并且为负,则序列将终止在距离数组末端这么远的地方。如果省略,则序列将从 offset 开始一直到 array 的末端。

`array_combine` 创建一个数组,用一个数组的值作为其键名,另一个数组的值作为其值

```

语法:array array_combine ( array keys, array values )

```

返回一个 array,用来自 keys 数组的值作为键名,来自 values 数组的值作为相应的值。

如果两个数组的单元数不同或者数组为空时返回 FALSE。

`array_merge` -- 合并一个或多个数组

```

语法: array array_merge ( array array1 [, array array2 [, array ...]] )

```

* array_merge() 将一个或多个数组的单元合并起来,一个数组中的值附加在前一个数组的后面。返回作为结果的数组。

* 如果输入的数组中有相同的字符串键名,则该键名后面的值将覆盖前一个值。然而,如果数组包含数字键名,后面的值将不会覆盖原来的值,而是附加到后面。

* 如果只给了一个数组并且该数组是数字索引的,则键名会以连续方式重新索引。

`array_intersect` -- 计算数组的交集

```

语法 array array_intersect ( array array1, array array2 [, array ...] )

```

array_intersect() 返回一个数组,该数组包含了所有在 array1 中也同时出现在所有其它参数数组中的值。注意键名保留不变。

`array_diff` -- 计算数组的差集

```

语法:array array_diff ( array array1, array array2 [, array ...] )

```

array_diff() 返回一个数组,该数组包括了所有在 array1 中但是不在任何其它参数数组中的值。注意键名保留不变。

###### 6 数组与数据结构

`array_pop` -- 将数组最后一个单元弹出(出栈)

```

语法:mixed array_pop ( array &array )

```

array_pop() 弹出并返回 array 数组的最后一个单元,并将数组 array 的长度减一。如果 array 为空(或者不是数组)将返回 NULL。

`array_push` --  将一个或多个单元压入数组的末尾(入栈)

```

语法:int array_push ( array &array, mixed var [, mixed ...] )

```

array_push() 将 array 当成一个栈,并将传入的变量压入 array 的末尾。array 的长度将根据入栈变量的数目增加。

`array_shift` --  将数组开头的单元移出数组

```

语法:mixed array_shift ( array &array )

```

array_shift() 将 array 的第一个单元移出并作为结果返回,将 array 的长度减一并将所有其它单元向前移动一位。所有的数字键名将改为从零开始计数,文字键名将不变。如果 array 为空(或者不是数组),则返回 NULL。

`array_unshift` --  在数组开头插入一个或多个单元

```

语法: int array_unshift ( array &array, mixed var [, mixed ...] )

```

array_unshift() 将传入的单元插入到 array 数组的开头。注意单元是作为整体被插入的,因此传入单元将保持同样的顺序。所有的数值键名将修改为从零开始重新计数,所有的文字键名保持不变。

###### 7 其他有用的数组处理函数

`array_rand` --  从数组中随机取出一个或多个单元

`shuffle` -- 将数组打乱

>Have a try

1. 分别使用for循环与foreach遍历输出下面数组中的值,并求出总和:

$a = array(10,30,50,70,90);

2. 使用list()、each与 while组合输出数组中的值:

$subject = array(“Linux”,”PHP”,”MySQL”,”HTML”,”CSS”,”JQuery”)

3. 使用reset(),end(),prev(),next(),key(),current();与do…while组合倒着输出数组中的值:

$subject = array(“Linux”,”PHP”,”MySQL”,”HTML”,”CSS”,”JQuery”)

4. 使用foreach循环输出数组中的值,并使用表格显示。

```

$stulist=array(

array(“name”=>”张三”,”age”=>20,”sex”=>”女”),

array(“name”=>”李四”,”age”=>21,”sex”=>”男”),

array(“name”=>”王五”,”age”=>22,”sex”=>”女”),

array(“name”=>”赵六”,”age”=>24,”sex”=>”男”),

);

```



推荐阅读
  • 包含phppdoerrorcode的词条 ... [详细]
  • 本文详细介绍了如何在PHP中记录和管理行为日志,包括ThinkPHP框架中的日志记录方法、日志的用途、实现原理以及相关配置。 ... [详细]
  • 本文详细介绍了 Java 网站开发的相关资源和步骤,包括常用网站、开发环境和框架选择。 ... [详细]
  • 本文介绍了 Go 语言中的高性能、可扩展、轻量级 Web 框架 Echo。Echo 框架简单易用,仅需几行代码即可启动一个高性能 HTTP 服务。 ... [详细]
  • 本文节选自《NLTK基础教程——用NLTK和Python库构建机器学习应用》一书的第1章第1.2节,作者Nitin Hardeniya。本文将带领读者快速了解Python的基础知识,为后续的机器学习应用打下坚实的基础。 ... [详细]
  • 本文详细介绍了Java代码分层的基本概念和常见分层模式,特别是MVC模式。同时探讨了不同项目需求下的分层策略,帮助读者更好地理解和应用Java分层思想。 ... [详细]
  • 操作系统如何通过进程控制块管理进程
    本文详细介绍了操作系统如何通过进程控制块(PCB)来管理和控制进程。PCB是操作系统感知进程存在的重要数据结构,包含了进程的标识符、状态、资源清单等关键信息。 ... [详细]
  • 从0到1搭建大数据平台
    从0到1搭建大数据平台 ... [详细]
  • Java高并发与多线程(二):线程的实现方式详解
    本文将深入探讨Java中线程的三种主要实现方式,包括继承Thread类、实现Runnable接口和实现Callable接口,并分析它们之间的异同及其应用场景。 ... [详细]
  • 在多线程环境中,IpcChannel的性能表现并未如预期般优于Tcp和Http通道。实际测试结果显示,在IIS6中通过Remoting创建的Ipc通道,其速度比Tcp通道慢了约20倍。本文详细分析了这一现象的原因,并提出了针对性的优化建议,以提升IpcChannel在高并发场景下的性能表现。 ... [详细]
  • Java Socket 关键参数详解与优化建议
    Java Socket 的 API 虽然被广泛使用,但其关键参数的用途却鲜为人知。本文详细解析了 Java Socket 中的重要参数,如 backlog 参数,它用于控制服务器等待连接请求的队列长度。此外,还探讨了其他参数如 SO_TIMEOUT、SO_REUSEADDR 等的配置方法及其对性能的影响,并提供了优化建议,帮助开发者提升网络通信的稳定性和效率。 ... [详细]
  • 深入解析Android 4.4中的Fence机制及其应用
    在Android 4.4中,Fence机制是处理缓冲区交换和同步问题的关键技术。该机制广泛应用于生产者-消费者模式中,确保了不同组件之间高效、安全的数据传输。通过深入解析Fence机制的工作原理和应用场景,本文探讨了其在系统性能优化和资源管理中的重要作用。 ... [详细]
  • C++ 异步编程中获取线程执行结果的方法与技巧及其在前端开发中的应用探讨
    本文探讨了C++异步编程中获取线程执行结果的方法与技巧,并深入分析了这些技术在前端开发中的应用。通过对比不同的异步编程模型,本文详细介绍了如何高效地处理多线程任务,确保程序的稳定性和性能。同时,文章还结合实际案例,展示了这些方法在前端异步编程中的具体实现和优化策略。 ... [详细]
  • 本指南详细介绍了在Linux环境中高效连接MySQL数据库的方法。用户可以通过安装并使用`mysql`客户端工具来实现本地连接,具体命令为:`mysql -u 用户名 -p 密码 -h 主机`。例如,使用管理员账户连接本地MySQL服务器的命令为:`mysql -u root -p pass`。此外,还提供了多种配置优化建议,以确保连接过程更加稳定和高效。 ... [详细]
  • Spring框架的核心组件与架构解析 ... [详细]
author-avatar
fst123
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有