php中,一些函数是通过利用数组的指针来进行操作的。今天简单谈一下数组中的指针操作函数。
今天其实写这篇文章,是为了记录一下自己的一些疑惑以及自己的解答罢了。
大多数人都应该直到,php中指针操作函数有7个,分别是
current(),key(),next(),prev(),each(),end(),reset()
但是实际上随着php的版本更新,其中有的方法已经不适用最新版的php了。

关于each()

比如说each(),这个函数我其实看到的第一眼就觉得有些眼熟,这个不就跟之前说的那个foreach很像么,如果不知道foreach可以看这篇

foreach循环
的文章然后在看一下对each()的描述。

获取数组中当前的键值对,并将数组指针向前移动一步

感觉其实比不明白什么意思,实际上这个就是类似于一个遍历了,获取这个数组中下标为0的元素的所有的值,下标和值以及对应的数值都会被获取到。
简单举一个例子,先说明前面的获取数组当前的键值对。

<?php header("Content-Type:text/html;charset=utf-8"); $array = array("php基础示例"=>'php',"asp基础实例"=>'asp',"jsp基础实例"=>'jsp',"php函数大全"=>'phph');
echo "<pre>"; print_r(each($array)); echo "</pre>";

使用pre这个html标签是为了保留格式,要不然出现的结果其实还是有点丑的,具体可以自己尝试一下。


/*Array ( [1] => php [value] => php [0] => php基础示例 [key] =>
php基础示例 )*/

首先其实最容易看到的就是key和value了,这个是相当于是索引形式,而0,1则类似于关联形式。
这个就是获取键值对了,那么向前移动一步是什么意思呢?
我们其实只需要再加一下print_r(each($array))就能看到效果了


<?php header("Content-Type:text/html;charset=utf-8"); $array = array("php基础示例"=>'php',"asp基础实例"=>'asp',"jsp基础实例"=>'jsp',"php函数大全"=>'phph');
echo "<pre>"; print_r(each($array)); echo "</pre>"; echo "<pre>";
print_r(each($array)); echo "</pre>"; /*Array ( [1] => php [value]
=> php [0] => php基础示例 [key] => php基础示例 ) Array ( [1] => asp
[value] => asp [0] => asp基础实例 [key] => asp基础实例 )*/

可以看到,虽然都是一样的代码,但实际上内在的内容已经不同,这是因为数组内的指针并不相通了,这就是向前移动一步,实际上是相当于向右移动一步。
而这个each一般是用在了循环上,循环遍历一下索引数组,自我猜测应该是在没有foreach循环的时候循环索引数组使用的方法。

<?php header("Content-Type:text/html;charset=utf-8"); $array = array("php基础示例"=>'php',"asp基础实例"=>'asp',"jsp基础实例"=>'jsp',"php函数大全"=>'phph');
while(list($a,$b) = each($array)){ echo "{$a}=>{$b}"; } /php基础示例=>phpasp基础实例=>aspjsp基础实例=>jspphp函数大全=>phph/

轻松得到数组的遍历结果。那么接下来讲一下为什么要废弃这个函数,说白了我认为其实还是因为有点小麻烦,再加上已经有了foreach了,所以就把它给废弃了。
在php7.2以上的版本运行会发出警告,但是还是可以得到结果。

Q A
PHPUnit version 6.0.0
PHP version 7.2.0RC6
Installation Method Composer

Running PHPunit on PHP 7.2 results in a deprecated warning:

PHP Deprecated: The each() function is deprecated. This message will be
suppressed on further calls in /home/travis/build/spatie/laravel-binary-uuid/vendor/phpunit/phpunit/src/Util/Getopt.php
on line 39 PHP Stack trace: PHP 1. {main}() /home/travis/build/spatie/laravel-binary-uuid/vendor/phpunit/phpunit/phpunit:0
PHP 2. PHPUnitTextUICommand::main() /home/travis/build/spatie/laravel-binary-uuid/vendor/phpunit/phpunit/phpunit:53
PHP 3. PHPUnitTextUICommand->run() /home/travis/build/spatie/laravel-binary-uuid/vendor/phpunit/phpunit/src/TextUI/Command.php:135
PHP 4. PHPUnitTextUICommand->handleArguments() /home/travis/build/spatie/laravel-binary-uuid/vendor/phpunit/phpunit/src/TextUI/Command.php:146
PHP 5. PHPUnitUtilGetopt::getopt() /home/travis/build/spatie/laravel-binary-uuid/vendor/phpunit/phpunit/src/TextUI/Command.php:291
PHP 6. each() /home/travis/build/spatie/laravel-binary-uuid/vendor/phpunit/phpunit/src/Util/Getopt.php:39

所以其实现在还是别使用each了,循环遍历的话,还是用foreach吧。

关于其余的函数

而其余的几个函数其实都很简单。
我们可以简单看一个图。
php数组指针函数
我们数组的初始指针是在1的位置,但是它的下标值为0,而我们使用函数的时候,下标值根据函数的作用发生改变,比如说前面的each(),使用一次each(),那么指针就会+1,所以才会出现上面两次输出each()的话,结果不同,而我们的next()和prev()就是如此,一个+1一个-1而end()和reset()则是重置为0或者变成最后一个。

没有什么难度应该,说一个小知识点如果我们在指针为0的时候使用prev()或者在最后的位置使用next()的话,会得到false,这是因为我们如果在头/尾使用向前或下一个的时候,并没有值了,所以返回false。
这就是为什么each()可以遍历数组的原因了,因为我们使用while循环,然后设置条件即可,如果到结尾的时候再下一步的话,就会返回false,而我们的while循环就会停下了。
关于while each()循环可以看上面的那串代码,应该是没有什么难度的。
如果有什么不懂的,可以在评论区留言,我会在看到的第一时间进行回复的。

最后修改:2021 年 04 月 19 日 10 : 38 PM
如果觉得我的文章对你有用,请随意赞赏