PHP 数组操作详解【遍历、指针、函数等】


Posted in PHP onMay 13, 2020

本文实例总结了PHP 数组操作。分享给大家供大家参考,具体如下:

数组

数据由元素组成,元素由键和值组成

数组分类

关联数组
关联数组,元素的下标与元素的值存在逻辑上的关系,称之为关联数组。指的是,键和值之间存在管理。

$a1 = array('name' => '李寻欢', 'age' => 34);

索引数组
索引数组,元素的值和下标不存在逻辑关系,而下标只表示值索引位置。

$a1 = array('李寻欢',34);

数组遍历

所要的完成遍历数组,需要依次得到每个元素的信息(键的信息和值的信息).核心在于数组的元素指针上

数组的元素指针

每一个数组内的,都有一个内部的指向某个元素的指针。
默认情况下,这个指针指向数组的第一个元素.
每个数组只有一个指针,同时时刻,只能指向一个元素,因此指针的位置,可以是任意一个已存在的元素。同时指针可能指向数组的外部(数组的末端[最后一个的外边]),就是非法位置.

PHP 数组操作详解【遍历、指针、函数等】

数组遍历就是
获得指针指向的元素的信息,移动指针,配合循环结构就可以完成。

php提供

  • 得到指针所指向的元素的信息

  • 可以移动指针

current(); 得到当前指针指向元素的值
key(); 得到当前指向元素的键
next(); 可以移动数组的指针

prev(); 向上移动一个元素.
reset(); 重置指针(移动到第一个元素)
end(); 移动到最右一个元素

数组末端,最右一个元素往右,非法的范围

next(), 和prev(); 可以将数组指针移动到非法位置上.

//$students 是数组
end($students);
next($students);
var_dump(current($students)); //false;

reset($students);
prev($students);
var_dump(current($students)); //false;

如果已经移动到非法位置,不可相对移动来挽回,此时,需要强制移动到某个位置, reset() , 和 end()

//$students 是数组
end($students);
next($students);
prev($students);
var_dump(current($students)); //false;

reset($students);
prev($students);
next($students);
var_dump(current($students)); //false;

foreach()

foreach(); 结构
专门用于数组遍历的一个结构,也是一个循环结构

foreach ( $arr as $key => $val ) {
  //循环体
}

如果元素的键,没有意义的话,可以使用 省略键的信息

foreach ( $arr as $val ) {}

注意:

foreach会移动数组指针,并且,在foreach遍历完毕后,指针处于非法位置(数组末端)
foreach在遍历一个数组元素时,会初始化元素指针,因此指针所指向的位置,不会影响到foreach的遍历
foreach在遍历时,原数组的拷贝,而不是直接在原数组进行遍历,如果在遍历过程中,对遍历的数组进行修改,是不会影响到遍历的结果
foreach所使用的保存元素值的变量,对其操作,不会对原数组产生影响
对值的操作,同时支持引用传递:可以改变原数组的值。

只需要在变量前增加&符号 即可。

PHP 数组操作详解【遍历、指针、函数等】

foreach流程图

PHP 数组操作详解【遍历、指针、函数等】

foreach也是循环结构, 受break和continue的控制。

each()

遍历每一个
可以获得当前的元素信息。(键和值),同时向下移动指针
获得元素信息,返回的是, 关联和索引数组
其中:
关联数组部分。

key => 当前元素的键
value => 元素的值

索引数组部分

0 => 元素的下标
1 => 元素的值

$arr = array(10, 12, 200);

$arr2 = array(
  'name' => 'zf',
  'age' => 20
);

var_dump(each($arr));
var_dump(each($arr2));

只遍历第一项
由于each既可以获取元素信息,又可以移动指针,因此非常适合完成除foreach外的手动的数组的遍历.

each+while+list的遍历数组

each如果指针非法,each返回false。 判断each的返回值

// 先eaech,将each的结果赋给$element
// 判断$element 是否成立(自动转成布尔类型)

while($element = each($sutdents)) {
  echo 'Key:', $element[0];
  echo '$nbsp;';
  echo 'Value:', $element[1];
  echo '<br/>';
}

list()
可以使在遍历的循环体内直接使用保存元素下标的变量.直接使用保存元素下标的变量和保存元素值的变量.
一个函数,可以通过一个数组,针对多个变量同时初始化

$student = array('李寻欢', '天机老人', '阿飞');

list($a, $b, $c) = $student; // 将数组内的元素, 以此赋值给list结构中的变量  // 类似 es6 中的解构赋值

var_dump($a, $b, $c);

list 针对索引数组生效

$student = array('李寻欢', '天机老人', '阿飞');

while (list($k, $v) = each($student)) {
  
  echo 'Key:', $k;
  
  echo ' ';
  
  echo 'Value:', $v;
  
  echo '<br/>';
  
};

数组复制元素指针

如果原数组指针合法:
数组在复制时,指针位置也会随之复制到目标数组内.

$a1 = array('a', 'b', 'c');

$a2 = $a1;
var_dump(current($a2)); // a

echo '<hr/>';

$a1 = array('a', 'b', 'c');
next($a1);

$a2 = $a1;
var_dump(current($a2)); // b

如果原数组指针非法:
将重置新数组的指针; 重置为默认指针.

$a1 = array('a', 'b', 'c');

end($a1);

next($a1);

$a2 = $a1;

var_dump(current($a2)); // a

foreach与数组指针关系

foreach对指针的影响有不确定性,因此不要依赖foreach遍历后的指针位置,如果需要操作,需要先重置(reset();).

数组遍历的是,原数组的拷贝,而不是直接在数组上进行操作.
php内部优化,写时复制(COW--copy on write) .如果不对原数组执行写操作. 是不会发生复制的过程. 在对原数组进行写操作时,这个复制的过程才会发生.
数组复制时的指针问题

PHP 数组操作详解【遍历、指针、函数等】

foreach遍历的时候,是拷贝,但是发生在对原数组进行操作之后.意味着,在写操作之前,遍历操作的就直接是原数组. 一旦发生了写操作,则会形成一个真实的拷贝,foreach去遍历的数组就与原数组不是同一个. 因此原数组指针就不会继续发生变化. 唯一的例外在最后一次循环体内对数组进行写操作,此时在复制前指针已经非法,则结果会被重置.

在实际操作中,建议处理完毕后,可以立即reset();
上面的问题,只适用于$value ,保存元素值的变量是值传递的情况,如果是引用传递的话.直接操作原数组!
$key不能引用传递.

array函数

常用函数

array_fill(起始位置,长度,内容); //使用固定值填充某些数量的元素.
count(); //统计数组元素个数. 支持递归统计.
range(起始范围,结束范围); //按照范围创建数组元素.
array_merge(); //合并多个数组.

// 注意一个下标冲突的情况,如果索引下标冲突,顺序增加.
// 关联数组冲突. 后合并的要覆盖前面的.
array_merge(range('a','z'),range('A','Z'));

array_rand(数组,选择的数量[默认一个]); //随机从数组中取得某些元素. 得到的是随机的下标,而不是元素值. 并且,如果是多个元素,会按照下标的大小进行排序.

shuffe(); //打乱元素顺序,参数是引用传递.

// 验证码中的 4位 随机数

// 创建一个大小混合的数组
$chars = array_merge(range('a','z'),range('A','Z'));

// 取得4个元素下标

$rand_keys = array_rand($chars, 4);

// 打乱
shuffle($rand_keys);

// 利用下标获取元素值
foreach ($rand_keys as $v) {
  echo $chars[$v];
}

键值操作

array_value(); //取得所有元素的所有值.
array_key(); //取得所有元素的所有键.

array_combine(); // 利用两个数组,其中一个为 键 ,另一个为值得到一个新数组.
in_array(); //判断数组中是否有某个值
array_key_exists(); //是否有某个元素.

array_search(); // 在数组内查找某个元素值,找到返回 下标. 找不到返回false.
array_filp(); // 交换元素的键和值.

合并拆分

'+'号

$a1 = array(1, 2, 3, 4);
$a2 = array(6, 7, 8);
var_dump($a1+$a2); // 如果出现下标冲突,则忽略后边的元素

array_merge($arr1, $arr2); // 合并多个数组.
array_chunk($arr, len); //按照子数组的长度,进行对原数组拆分.

explode(); //将一个字符串,按照某个字符,分割成多个部分.
implode(); //可以将数组元素的值, 利用某个字符,连接

$arr = array('aa', 'bb');

echo $arr = implode('-', $arr); // aa-bb

print_r(explode('-', $arr));

compact(); 合并, 利用多个变量,合并成一个数组. 其中变量的名字作为数组的下标. 变量的值,作为值. 注意参数是变量名

$width = 2;
$height = 10;

$arr = compact('width', 'height');

extact(); 拆分,将一个变量,拆分成一个变量。每一个元素为一个变量。 下标为变量名,值为变量值. 字符串的下标.
注意,如果当前已经存在变量名,则会发生将已有变量值替换的操作.这个是默认行为.可以修改,通过extact(),第二个参数. 默认为EXTR_OVERWRITE表示重写 //EXTR_SKIP 表示略过.

PHP 数组操作详解【遍历、指针、函数等】

array_diff(数组1,数组2); // 得到数组1中与数组2中不相同的元素. -- 差集 值判断.
array_intersect(数组1,数组2);// 得到数组1中与数组2中相同的元素. --交集.

array_map($callback, $arr1); // 对数组内的每个元素,进行一次操作.分别调用某个函数进行一次调用.
如果函数是自定义的.
注意,应该有参数接收元素值,同时应该有返回值

$a1 = array(10, 20, 3);

function x2 ( $item ) {
  return $item * 3;
}

$arr = array_map('x2', $a1);

var_dump($arr);

只负责定义,不负责调用. array_map(); 函数内部负责调用.
可以同时接收或处理.是统一操作,一次将所有数组相同位置都操作一遍,而不是逐一操作. 因此该函数所接受的参数个数,与所传递的数组的数量应该一致.
有一个默认操作,非常常用,利用多个数组,组合成一个新数组。要求,函数位置传递一个null.

$names = array('z1', 'z2', 'z3');

$maths = array(50, 40, 60);

$score = array_map(null, $names, $maths);

var_dump($score);

回调函数的使用-模拟数据结构函数-排序函数


array_walk($funcname);
针对一个数组的每个元素进行操作,与array_map的不同点.

  • array_map() 可以操作多个数组,而array_walk(); 只可以操作一个数组.

  • array_map(); 只可以得到元素值,而array_walk(); 即可以得到元素值,还可以得到元素的键.

  • 可以对函数的第一个参数进行引用传递,达到修改的原有数组的目的.

$names = array('aa', 'bb', 'cc');

function fn1 ( &$val,$key ) {
  var_dump($val,$key);
}

array_walk($names, 'fn1');

模拟数据结构

入栈 array_push();
出栈 array_pop();
// 每次操作后,索引都会重新索引.

顶端出: array_shift();
顶端入: array_unshift();

排序函数

soft(); 按照值升序
rsoft() 按照值降序
ksoft()按照键升序
krsoft(); 按照键降序
// 值排序,不会保留键值关系,而键排序会保留键值关系.
// 按照值排序,同时保留键值关系.

asort(); 按照值,升序,保留键值关联.
arsort(); 按照值,降序,保留键值关联.

key,键
reverse(): 反序,默认是升序.
association: 关联

希望本文所述对大家PHP程序设计有所帮助。

PHP 相关文章推荐
用Socket发送电子邮件
Oct 09 PHP
php自动加载autoload机制示例分享
Feb 20 PHP
将php数组输出html表格的方法
Feb 24 PHP
PHP静态文件生成类实例
Nov 29 PHP
php中静态类与静态变量用法的区别分析
Jan 15 PHP
PHP借助phpmailer发送邮件
May 11 PHP
Zend Framework连接Mysql数据库实例分析
Mar 19 PHP
thinkPHP3.1验证码的简单实现方法
Apr 22 PHP
PHP实现APP微信支付的实例讲解
Feb 10 PHP
详解PHP素材图片上传、下载功能
Apr 12 PHP
php基于协程实现异步的方法分析
Jul 17 PHP
在Laravel中使用GuzzleHttp调用第三方服务的API接口代码
Oct 15 PHP
ThinkPHP5 框架引入 Go AOP,PHP AOP编程项目详解
May 12 #PHP
php中用unset销毁变量并释放内存
May 10 #PHP
php屏蔽错误及提示的方法
May 10 #PHP
php判断数组是否为空的实例方法
May 10 #PHP
通过PHP实现获取访问用户IP
May 09 #PHP
如何通过PHP实现Des加密算法代码实例
May 09 #PHP
php变量与字符串的增删改查操作示例
May 07 #PHP
You might like
php 文章采集正则代码
2009/12/28 PHP
实例讲解yii2.0在php命令行中运行的步骤
2015/12/01 PHP
PHP命名空间namespace用法实例分析
2016/09/27 PHP
gearman中任务的优先级和返回状态实例分析
2020/02/27 PHP
Highslide.js是一款基于js实现的网页中图片展示插件
2020/03/30 Javascript
仅IE不支持setTimeout/setInterval函数的第三个以上参数
2011/05/25 Javascript
图片在浏览器中底部对齐 解决方法之一
2011/11/30 Javascript
JSuggest自动匹配下拉框使用方法(示例代码)
2013/12/27 Javascript
使用javascript做的一个随机点名程序
2014/02/13 Javascript
通过实例理解javascript中没有函数重载的概念
2015/06/03 Javascript
常见的javascript跨域通信方法
2015/12/31 Javascript
JavaScript实现点击文本自动定位到下拉框选中操作
2016/06/15 Javascript
bootstrap模态框实现拖拽效果
2016/12/14 Javascript
js es6系列教程 - 基于new.target属性与es5改造es6的类语法
2017/09/02 Javascript
Vue使用vue-area-linkage实现地址三级联动效果的示例
2018/06/27 Javascript
Fetch超时设置与终止请求详解
2019/05/18 Javascript
JS中的算法与数据结构之二叉查找树(Binary Sort Tree)实例详解
2019/08/16 Javascript
Ant Design Vue 添加区分中英文的长度校验功能
2020/01/21 Javascript
vue.js封装switch开关组件的操作
2020/10/26 Javascript
node中短信api实现验证码登录的示例代码
2021/01/20 Javascript
[49:12]完美世界DOTA2联赛PWL S2 Magma vs GXR 第二场 11.29
2020/12/02 DOTA
Python编写的com组件发生R6034错误的原因与解决办法
2013/04/01 Python
Python+tkinter使用80行代码实现一个计算器实例
2018/01/16 Python
django使用haystack调用Elasticsearch实现索引搜索
2019/07/24 Python
为2021年的第一场雪锦上添花:用matplotlib绘制雪花和雪景
2021/01/05 Python
泰国折扣酒店预订:Hotels2Thailand
2018/03/20 全球购物
匡威英国官网:Converse英国
2018/12/02 全球购物
main 函数执行以前,还会执行什么代码
2013/04/17 面试题
大学生职业规划论文
2014/01/11 职场文书
新娘父亲婚礼致辞
2014/01/16 职场文书
工商管理专业大学生职业生涯规划范文
2014/03/09 职场文书
技能比武方案
2014/05/21 职场文书
内勤岗位职责范本
2015/04/13 职场文书
冰雪公主观后感
2015/06/16 职场文书
go语言求任意类型切片的长度操作
2021/04/26 Golang
Python绘制地图神器folium的新人入门指南
2021/05/23 Python