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 相关文章推荐
php strlen mb_strlen计算中英文混排字符串长度
Jul 10 PHP
PHP中的session永不过期的解决思路及实现方法分享
Apr 20 PHP
PHP字符串比较函数strcmp()和strcasecmp()使用总结
Nov 19 PHP
Zend Framework入门之环境配置及第一个Hello World示例(附demo源码下载)
Mar 21 PHP
php unicode编码和字符串互转的方法
Aug 12 PHP
thinkphp 抓取网站的内容并且保存到本地的实例详解
Aug 25 PHP
PHP封装的非对称加密RSA算法示例
May 28 PHP
PHP使Laravel为JSON REST API返回自定义错误的问题
Oct 16 PHP
PHP fprintf()函数用法讲解
Feb 16 PHP
PHP7匿名类的用法示例
Apr 05 PHP
PHP 进程池与轮询调度算法实现多任务的示例代码
Nov 26 PHP
Laravel + Elasticsearch 实现中文搜索的方法
Feb 02 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文章按日期(月日)SQL归档语句
2012/11/29 PHP
利用PHP+JS实现搜索自动提示(实例)
2013/06/09 PHP
ThinkPHP入口文件设置及相关注意事项分析
2014/12/05 PHP
php的crc32函数使用时需要注意的问题(不然就是坑)
2015/04/21 PHP
PHP的openssl加密扩展使用小结(推荐)
2016/07/18 PHP
PHPCMS忘记后台密码的解决办法
2016/10/30 PHP
获取客户端电脑日期时间js代码(jquery)
2012/09/12 Javascript
通过jQuery源码学习javascript(一)
2012/12/27 Javascript
javascript判断两个IP地址是否在同一个网段的实现思路
2013/12/13 Javascript
瀑布流布局代码一例
2014/04/11 Javascript
Js实现网页键盘控制翻页的方法
2014/10/30 Javascript
微信小程序 教程之列表渲染
2016/10/18 Javascript
js获取指定时间的前几秒
2017/04/05 Javascript
利用npm 安装删除模块的方法
2018/05/15 Javascript
Vue中Axios从远程/后台读取数据
2019/01/21 Javascript
nodejs使用node-xlsx生成excel的方法示例
2019/08/22 NodeJs
Vue实现导航栏的显示开关控制
2019/11/01 Javascript
js实现圆形显示鼠标单击位置
2020/02/11 Javascript
vue render函数动态加载img的src路径操作
2020/10/26 Javascript
Vant Weapp组件踩坑:picker的初始赋值解决
2020/11/12 Javascript
[55:45]DOTA2上海特级锦标赛D组败者赛 Liquid VS COL第一局
2016/02/28 DOTA
Python(Tornado)模拟登录小米抢手机
2013/11/12 Python
python 异常处理总结
2016/10/18 Python
PyCharm中代码字体大小调整方法
2019/07/29 Python
python调用支付宝支付接口流程
2019/08/15 Python
Pytorch模型转onnx模型实例
2020/01/15 Python
Python多线程threading创建及使用方法解析
2020/06/17 Python
详解CSS3 filter:drop-shadow滤镜与box-shadow区别与应用
2020/08/24 HTML / CSS
SEPHORA丝芙兰捷克官网:购买香水、化妆品和护肤品
2018/11/26 全球购物
一套VC试题
2015/01/23 面试题
2014全国两会心得体会
2014/03/17 职场文书
爱护公共设施倡议书
2014/08/29 职场文书
商铺租房协议书范本
2014/12/04 职场文书
房地产销售主管岗位职责
2015/02/13 职场文书
老干部座谈会主持词
2015/07/03 职场文书
winserver2019安装软件一直卡在应用程序正在为首次使用做准备
2022/06/10 Servers