首页 > 编程语言 >【web 开发】PHP8中对数组操作的新变化

【web 开发】PHP8中对数组操作的新变化

时间:2023-06-02 17:36:02浏览次数:48  
标签:web 结果 list 循环 PHP8 数组 PHP5

自动创建元素的顺序改变

在PHP8中,引用赋值时,自动创建的数组元素或者对象属性的顺序和PHP7版本相比发生了变化,下面我们通过例子来体验下变化在哪里.

<?php
$array = [];
$array['a'] = &$array['b'];
$array['b'] = 1;
echo "\n";
var_dump($array);
?>

执行结果如下:

【web 开发】PHP8中对数组操作的新变化_赋值

这个结果是PHP8运行之后的结果,而在PHP7的版本中元素的位置不会自动创建元素的顺序,而PHP会根据引用自动创建元素的顺序.

PHP8中list()函数修改数组的改变

在PHP8中list()函数的功能发生以下改变:

1.不再按照相反的顺序赋值

在PHP8中,list()函数不再按照相反的顺序赋值,而在PHP5中,list()函数按照相反的顺序赋值.

<?php
list($array[],$array[],$array[],$array[]) = [10,20,30,40];

var_dump($array);
?>

PHP8中的执行结果如下:

【web 开发】PHP8中对数组操作的新变化_赋值_02

从结果可以看出,虽然赋值没有变化,但是赋值的顺序发生了变化,在PHP8中,返回的数组$array == [10,20,30,40].在PHP5中,返回的数组$array == [40,30,20,10]

2.不再允许赋空值

在PHP8中不再允许赋空值,具体代码如下:

<?php
list() = $a;
list() = $a;
list($x, list(), $y) = $a;

上面的代码在PHP8中运行会直接报错,而在PHP5中,list()是允许赋空值的.

3.不再支持字符串拆分功能

在PHP8中,list()函数不再支持字符串拆分功能.具体代码如下:

<?php
$string = "xy";
list($x, $y) = $string;
echo "$x";
echo "$y";
?>

在PHP8中运行直接报错,显示语法解析错误,而在PHP5中上述代码最终的结果是:$x == "x" and $y == "y"

4.可以用于数组对象

我们先来看看代码,再说结论:

<?php
list($a, $b, $c) = (object) new ArrayObject([10,20,30]);
echo "$a\n";
echo "$b\n";
echo "$c\n";
?>

执行结果如下:

【web 开发】PHP8中对数组操作的新变化_php_03

在PHP8中,上述代码最终的结果是$a == 10 and $b == 20 and $c == 30.而在PHP5中,上述代码最终的结果是:$a == null and $b == null and $c == null,而且不会有提示.运行一片空白.

foreach()函数修改数组的改变

在PHP8中,foreach()函数的功能也发生了变化.

1.对内部指针失效

在PHP8中,foreach()循环对数组内部指针不再起作用.

<?php
$array = [1,2,3];
foreach($array as &$a){
	var_dump(current($array));           
	
	
}

在PHP8中运行的运行结果如下:

【web 开发】PHP8中对数组操作的新变化_数组_04

结果会打印三次int(1),也就是说数组的内部指针并没有改变.在PHP5中运行的结果会显示:int 1, int 2,和 boolean false.

2.按照值进行循环时,修改数组不再影响循环行为

在PHP8中,foreach()按照值进行循环的时候,foreach()是对该数组的一个复制操作.这样在循环过程中对数组做的修改是不会改变影响循环行为的.

<?php
$array = [100,200,300];
$ref =& $array;
foreach ($array as $val) {
    unset($array[1]);
    echo "数组值: " . $val . "\n";
}
?>

执行结果如下:

【web 开发】PHP8中对数组操作的新变化_赋值_05

在PHP 8中,上面的代码虽然在循环中把数组的第2个元素销毁掉了,还是会把数组的3个元素全部打印出来。而在PHP 5中,上面的代码只会把2个元素打印出来(100、300)。

3.按照引用进行循环时,对数组的修改会影响循环

如果在循环的时候使用引用的方式,对数组的修改就会影响循环行为。

<?php
$array = [100];
foreach ($array as &$val) {
    echo "数组值: " . $val . "<br/>";
    $array[1] =200;
    $array[2] =300;
}
?>

执行结果如下:

【web 开发】PHP8中对数组操作的新变化_php_06

在PHP 8中,追加的元素也会参与循环,结果会打印100、200、300; 而在PHP 5中,追加的元素不会参与循环,结果只会打印100。

标签:web,结果,list,循环,PHP8,数组,PHP5
From: https://blog.51cto.com/micai01/6404282

相关文章

  • Web安全测试—Web应用基础
    基本构件Web应用有各种各样的形式和规模。可能是一台服务器,使用相当轻量级的脚本语言,向用户发送各种类型的报告;也可能是庞大的B2B工作流系统,每小时处理上百万条订单和发票;也可能是介于两者之间的任何形式。什么是技术栈任何Web应用中,我们都必须考虑一套技术,这......
  • 判断数组内所有属性均相等
     if( this.data.orderList.every(item=>item.obligationTime===this.data.orderList[0].obligationTime)){        console.log('全等')        this.data.flag=true        clearInterval(this.data.timer)      }else{        co......
  • 560. 和为 K 的子数组
    思路难度中等1936给你一个整数数组 nums 和一个整数 k ,请你统计并返回 该数组中和为 k 的连续子数组的个数 。 示例1:输入:nums=[1,1,1],k=2输出:2示例2:输入:nums=[1,2,3],k=3输出:2 提示:1<=nums.length<=2*104-1000<=nums[i]<=1......
  • WebStorm前端启动JetLinks 物联网基础平台(2.x)
    目录一、环境准备二、下载源码三、安装依赖四、修改配置五、启动项目六、访问项目一、环境准备1.降级node版本为12.22.0使用node版本管理器gnvm_苍穹之跃的博客-以管理员身份打开cmd,cd到node安装目录。2.降级npm版本为[email protected]二、下载源码jetlinks-ui-antd:......
  • Vue修改数组、对象并且触发视图更新的方法以及原理
    一、数组 items:['a','b','c'];//一个普通的数组this.items[1]='x';//修改已有项this.items[3]='d';//新增一项this.item.length=2;//修改数组的长度//一个对象数组msg:[{id:1,selected:true,title:'aaa',},{i......
  • 基于Grafana的WebUI添加Prometheus数据源(三)
    基于Grafana的WebUI添加Prometheus数据源(三)1、Grafana介绍1.1什么是GrafanaGrafana是一款近几年比较流行的开源数据绘图工具平台。Grafana原生支持包括但不限于InfluxDB,MySQL,OpenTSDB,PostgreSQL和Prometheus等多种数据源作为输入源数据。官方地址:https://grafana.com......
  • 划分数组专题
    一般采用回溯法思想,但需要将问题进行转化,同时采用动态规划减小时间复杂度1.分割等和子数组2.目标和3.划分k个相等的子集4.三等分......
  • [Python]-numpy模块-反转数组的三种方法
    给定一个一维numpy数组,反转数组的三种方法:切片索引numpy.flipud()函数numpy.flip()函数importnumpyasnpa=np.array([1,2,3,4,5])#切片索引ans1=a[::-1]print(ans1)#[54321]#numpy.flipud()函数ans2=np.flipud(a)print(ans2)#[54321]#n......
  • webrtc-streamer使用
    下载地址:https://github.com/mpromonet/webrtc-streamer/releases获取使用的所有api:webrtc-streamer的服务地址:192.168.1.8:8000查询所有api:http://192.168.1.8:8000/api/help["/api/addIceCandidate","/api/call","/api/createOffer",......
  • 在web应用中使用mybatis
    1. 实现功能:52银⾏账户转账1.1 使⽤技术:HTML + Servlet + MyBatis1.2 WEB应⽤的名称:bank2. 数据库表的设计和准备数据  523. 注意MyBatis对象作⽤域以及事务问题   573.1 MyBatis核⼼对象的作⽤域   573.1.1 SqlSessionFactoryBuilder这个类可以被实例化、使⽤......