PHP 行为和数组指针

2024-02-17

我正在阅读 PHP 手册(特别是each() http://php.net/each函数)并遇到以下警告:

Caution
因为将数组分配给另一个变量会重置原始数组的指针,所以如果我们将 $fruit 分配给循环内的另一个变量,上面的示例将导致无限循环。

举个例子:

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

reset($fruit);
while (list($key, $val) = each($fruit)) {
    echo "$key => $val\n";
}
?>

好的。这说得通。但我决定做一个简单的测试:

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

    foreach ($fruit as $key => $name) {
        printf("[%s] => [%s]\n", $key, $name);
    }

    $fruit2 = $fruit;
    echo current($fruit);
?>

结果是预期的:指针已重置。我的问题是指针是否仅在数组结束后重置?

例如:

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

    foreach ($fruit as $key => $name) {
        printf("[%s] => [%s]\n", $key, $name);
    }

    reset($fruit);
    next($fruit)."\n";
    $fruit2 = $fruit;
    echo current($fruit);
?>

指针保留在第二个数组元素中('b' => 'banana')。 这种行为是语言的特征吗?

谢谢你,抱歉英语不好。


这种行为是语言的特征吗?

PHP 数组中“指针”的含义与“指针”的一般含义(在 C/C++ 或其他允许程序员直接访问内存的语言中)不同。

PHP 中没有指针。这array http://php.net/manual/en/language.types.array.php数据类型在其包含的值列表内部保留一个游标。称为数组的内部指针,由函数修改reset() http://php.net/manual/en/function.reset.php, next() http://php.net/manual/en/function.next.php, prev() http://php.net/manual/en/function.prev.php, end() http://php.net/manual/en/function.end.php, each() http://php.net/manual/en/function.each.php也许还有其他人。它可用于迭代数组,如下所示:

$array = array(1, 2, 3);
while (list($key, $val) = each($array)) {
    echo($key.' => '.$val."\n");
}

没有可靠的方法来使用迭代数组next() http://php.net/manual/en/function.next.php or prev() http://php.net/manual/en/function.prev.php因为他们回来了FALSE当没有更多的元素可以迭代但它们也返回时FALSE当值FALSE作为元素存储在数组中。

如果您只需要分析数组开头(或结尾)的几个项目,它们可能会很有用。 F.e.假设我们有一个函数返回的整数数组,我们需要获取第一个不为零的值。

但是这个目标可以通过使用更容易地实现foreach():

$array = array(0, 0, 0, 2, 0, 1, 0, 3);
foreach ($array as $val) {
    if ($val != 0) {
        break;
    }
}
echo($val);           // prints "2"

or array_shift():

$array = array(0, 0, 0, 2, 0, 1, 0, 3);
do {
    $val = array_shift($array);
    if ($val != 0) {
        break;
    }
} while(count($array));
echo($val);           // prints "2"

结果是预期的:指针已重置。我的问题是指针是否仅在数组结束后重置?

的文档foreach() http://php.net/manual/en/control-structures.foreach.php是错的。也许它在 PHP 3 和 PHP 4 上是正确的,但我认为自从引入迭代器 http://php.net/manual/en/class.iterator.php在 PHP 5 中的行为foreach() http://php.net/manual/en/control-structures.foreach.php改变(变得更好)。

It says:

当 foreach 第一次开始执行时,内部数组指针会自动重置为数组的第一个元素。这意味着您不需要在 foreach 循环之前调用 reset()。

由于 foreach 依赖于内部数组指针,因此在循环内更改它可能会导致意外的行为。

一个简单的测试与这个说法相矛盾:

$array = array(1, 3, 5, 7, 9);

foreach ($array as $val1) {
    foreach ($array as $val2) {
        echo('$val1='.$val1.'; $val2='.$val2.'; ');
    }
    echo("\n");
}

它工作没有问题。它不应该工作,如果foreach()正在使用内部数组指针。它可能会创建指针的副本。

您也可以尝试使用current(), next(), prev() or reset()在 - 的里面foreach()你会得到令人惊讶的、有时甚至不一致的结果。

你最好用foreach()迭代数组并且不以任何方式依赖内部指针。

功能reset() and end()然而,当您需要获取数组的第一个和最后一个元素而不用担心键时,它们非常方便。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

PHP 行为和数组指针 的相关文章

  • 如何对 PHP 数组中的值进行排序/过滤?

    我需要 foreach 这个数组的值 My CODE 该代码的结果 Array 0 gt Array 0 gt Age Name 1 gt 22 Yrs Value 2 gt Ethnicity Name 3 gt Caucasian Va
  • 在 PHP 中的请求之间存储对象而不进行序列化

    我正在用 PHP 编写一个有状态的 Web 应用程序 其中状态可能包含大量对象 目前 我将所有这些对象保存在 SESSION 中 并在请求结束时将它们序列化 这有点痛苦 因为序列化整个会话需要几秒钟 而反序列化则需要更多时间 我想尝试 AP
  • 在 PHP 中比较字符串的方式与 MySQL 相同

    我将 varchar 存储在 utf8 MySQL 表中并使用 utf8 general ci 排序规则 我在 varchar 上有一个唯一索引 我想在 PHP 中进行字符串比较 这相当于 MySQL 对索引所做的操作 一个具体的例子是 我
  • $_POST 返回空

    尝试练习一下 ajax 和 PHP 我不明白为什么每当我发送一些东西时 它都会返回空或未定义的索引 PHP 返回空 JS form submit function var meth this attr action var msg msg
  • openssl_decrypt 标签值

    我在网站中使用 openssl encrypt decrypt 方法 但在使用 tag 选项时遇到了一些问题 openssl encrypt data method key options iv tag openssl decrypt da
  • mysql_fetch_array while 循环。它是如何工作的?

    我已经阅读了 php net 上的该函数 但这仍然没有回答我的问题 我对 C 语言有一定的了解 并且刚刚开始使用 php 通常在 C 中 如果要执行 while 循环 则需要有一些条件来将循环推进到不再有效的点 如下所示 while x g
  • SQL 更新数据集中的位置

    id1 id2 bool 1 1 F 1 2 F 2 1 F UPDATE table name SET bool T WHERE id1 id2 IN 1 1 2 1 Need work here 所以基本上我想选择条件为 id1 id2
  • 为什么byteArray的长度是22而不是20?

    我们尝试从字符串转换为Byte 使用以下 Java 代码 String source 0123456789 byte byteArray source getBytes UTF 16 我们得到一个长度为 22 字节的字节数组 我们不确定这个
  • Laravel - 动态更改电子邮件设置不起作用

    我的应用程序的所有电子邮件设置都存储在数据库中 用户可以选择更改这些设置 而且一切都很好 但我正在尝试设置 发送测试电子邮件 功能 以允许用户在保存设置之前测试其设置 当他们提交发送测试电子邮件的表单时 电子邮件将通过原始设置而不是新设置发
  • 当我使用加盐 CRYPT_MD5 加密我的密码时,正在加密什么?

    对字符串使用 md5 总是会产生字母数字加密结果 即 没有符号 然而 当我使用 php crypt 函数 特别是带有盐的 CRYPT MD5 并且它已打开 我已经检查过 时 它返回的假定 md5 哈希看起来不像 md5 哈希 例如 如果我
  • 竞争性编码 - 以最低成本清除所有级别:未通过所有测试用例

    当我遇到这个问题时 我正在一个竞争性编码网站上解决问题 问题指出 游戏中有 N 个关卡和 M 种可用武器 等级编号从 0 到 N 1 武器编号从 0 到 M 1 您可以按任意顺序清除这些级别 在每个关卡中 需要这些 M 武器的某些子集才能通
  • PHP 中消息队列和工作系统的有效架构?

    我正在尝试了解我想要在 PHP 应用程序中实现的消息队列模型和作业 我的目标是卸载需要发送到多个第三方 API 的消息 数据 因此访问它们不会减慢客户端的速度 所以将数据发送到消息队列是理想的 我考虑过仅使用 Gearman 来保存 MQ
  • PySpark - RDD 到 JSON

    我有一个 Hive 查询返回以下格式的数据 ip category score 1 2 3 4 X 5 10 10 10 10 A 2 1 2 3 4 Y 2 12 12 12 12 G 10 1 2 3 4 Z 9 10 10 10 10
  • 正则表达式提取大括号之间的文本

    我正在尝试提取 PHP 中花括号之间的文本 例如 欢迎 user first name 使用 site 版本 1 5 您的用户名 是 user username 您目前的声誉是 user reputation name 我用过 在某些情况下
  • 按元素聚合数组

    Spark scala 相当新 我想知道是否有一种简单的方法以按列方式聚合 Array Double 这是一个例子 c1 c2 c3 1 1 1 0 1 0 3 4 1 2 1 0 0 0 4 3 2 1 0 0 0 0 0 0 2 3 1
  • 使用 file_get_contents 在 php 中进行屏幕缩放

    嗨 我对屏幕抓取很陌生 我正在尝试从酒店预订网站上抓取评论以显示在我的网站上 我已经走到这一步了 但有点卡住了 有人可以帮忙吗 use 文档 http php net manual en class domdocument ph
  • 为什么 char 数组需要 strcpy 而 char star 不需要 - 在 C 中使用结构

    我对这段代码有一个误解 typedef struct EXP int x char name char lastName 40 XMP main XMP a a name eaaa a lastName strcpy a lastName
  • FOSRestBundle:显示我的自定义异常消息

    我试图在 FOSRestBundle 中添加异常的自定义控制 但它似乎忽略了我的自定义消息 响应的状态代码正常 I have throw new HttpException 404 User id not found 但得到这个 json
  • 为什么 sql 字段名称中不应该包含逗号?

    人们一直告诉我列名中不应包含空格 我只是想知道 这是为什么 这是我为学校创建的一些数据库表遇到的问题 字段名称包括 Preble 和 Darke 相反 它们需要是 普雷布尔县 俄亥俄州 和 达克县 俄亥俄州 如果它们是行名称 我只需创建一个
  • 如何使用 monolog ElasticSearchHandler 登录 Laravel 应用程序

    Monolog 包含弹性搜索处理程序和格式化程序 但它作为自定义通道对 Laravel 的实现并不像 Laravel 文档网站上描述的那么简单 以下是如何执行此操作的简要分步说明 为您的弹性搜索日志记录创建一个配置文件 config ela

随机推荐

  • 如何在 iOS 上以编程方式将视图旋转 180 度?

    如何在我的 iPhone 应用程序中以编程方式将视图旋转 180 度 由于 CGAffineTransform Rotate 使用弧度作为测量单位 并且 180 度与 PI 相同 因此您可以简单地执行以下操作 而不是其他答案中提供的数学 v
  • 在 R 中导入 csv 文件/从整数转换为双精度时出现问题

    今天我终于决定开始攀登 R 陡峭的学习曲线 我花了几个小时 成功导入了数据集并做了一些其他基本的事情 但我在数据类型方面遇到了问题 包含小数的列作为整数导入 转换为双精度会更改值 在尝试获取一个小的 csv 文件放在这里作为示例时 我发现仅
  • 经典 ASP 在 IIS7 中始终返回代码 200

    我在 IIS7 中启用了跟踪 我在 IIS 管理工具的 ASP 选项卡中将这些属性设置为 true 应用程序允许客户端调试 应用程序允许调试 错误到NTLog 脚本错误发送到浏览器 为了测试它 我编写了一个小型的经典 ASP 测试页 其中我
  • EF:选择子类的所有实体(继承)

    我正在使用数据库优先方法和 DbContext 我的数据模型中有几个继承结构 TPH 但是DbContext只为基类创建一个DbSet 而没有为子类创建一个DbSet 我应该如何检索指定子类的所有实体 我无法根据映射条件编写查询 因为我必须
  • Codeigniter 和 RestServer。如何上传图片?

    我正在 Codeigniter 中使用 Phils RestServer 请参阅链接 编写 API 我需要一种通过 API 上传图像的方法 我怎样才能做到这一点 是否就像使用正确的标头 使用什么标头 发出 POST 请求一样简单 https
  • 如何获得 DIV 的“自动”高度

    所以当我用 jquery 在 div 上设置固定高度时 就像 div height 200 的价值 div height 始终为 200 即使该 div 的内容超过该高度 我使用overflow hidden 我怎样才能获得 DIV 的真实
  • ASP.NET MVC 视图引擎性能

    我正在使用 asp net mvc 最终版本开发高负载解决方案 最近我们的团队注意到 服务器响应客户端的大部分时间都用于页面渲染 简单的时间安排如下所示 Page start 1 8608363s Render module 1140 Mo
  • 突破溢出:隐藏

    我们目前正在努力尝试突破隐藏溢出的 div 我们有一个下拉菜单 当用户键入时 在搜索字段中键入 c 即可查看 该菜单中会填充建议 该下拉菜单当前隐藏在菜单栏后面 因为它具有 溢出隐藏 如果我们移除top 100 并将位置设置为fixed 但
  • 我正在使用什么 SDL 和 OpenGL 版本和实现

    我下载了 SDL 1 2 14 在 Windows 7 上 我安装了 Mobility Radeon X1800 驱动程序 我正在使用 Microsoft Visual C 2010 Express 我在 VC 目录 中添加了SDL包含和库
  • StoreKit 返回所有产品 ID

    这个问题与我在这里找到的其他问题有点不同 我的 In App StoreKit 正在运行 我可以成功列出我的商店中的产品 我已经浏览了苹果文档 但从未看到我的问题得到解决 我可能错过了 我的客户 非营利组织 希望能够通过他们的应用程序接受捐
  • 在 Google Cloud 端点中实施缓存控制

    无论参数列表如何 我的端点方法都会为每次调用生成不同的响应 我经常看到我的客户端使用相同的参数列表调用端点 并且前端实例返回缓存的响应 In the 官方文档 https cloud google com appengine docs ja
  • 通过allow_url_include=0 在服务器配置中禁用包装器

    我正在尝试使用检索页面内容AJAX称呼 我在页面包装器中有一系列链接 当我点击一个链接时 它会加载一个 JavaScript 函数 该函数从php脚本 在这种情况下 我正在开发我的localhost 但在生产中 脚本将位于与执行以下操作的文
  • Keras 教程错误:NameError:名称“层”未定义

    我正在尝试跟随this https www tensorflow org guide kerasKeras教程 但是使用命令编译时遇到以下错误python3 test py Traceback most recent call last F
  • 如何获取任意位置的当前时间

    我必须上传图像 并且必须发送上传图像时的日期和时间 我正在获取上传图像的设备的纬度和经度 现在我想获取该图像的时间和日期上传图像时的位置 我不想从设备中获取日期和时间 是否可以借助该地点的纬度和经度来获取日期和时间 您可以通过 GeoNam
  • MEX 文件可以使用 -fsanitize=address 运行吗?

    我有一个用 g 正常编译的 MEX 文件 我最近将其编译更改为使用 clang 并包含 fsanitize address进入两个LDFLAGS and CFLAGS 注意 此项目不存在 CXX 标志 然而 尽管如此 一旦我进入 MATLA
  • 在 docker 中使用 vaadin 运行 Spring boot 应用程序时初始化 Tomcat 失败

    我是一名业余爱好者 最近从 heroku 切换到 render com 我想把我的 SringBoot 应用程序放在那里 但它要求我在我没有经验的 docker 环境中运行它 我设法为其编写 Dockerfile 并从 jar 文件运行它
  • 控制行长 d3.js

    我使用以下代码生成一个被其他圆圈包围的圆圈 这些圆圈都通过以下方式连接到主圆圈
  • 动态添加 Angular 指令

    我对 Angular JS 相当陌生 并且发现它的学习曲线很陡峭 我感觉我真的错过了这里的要点 但这里是 我想从控制器向我的页面添加指令 所以我想如果我将指令标签添加到页面 指令和关联的控制器 模板等就会随之添加 在阅读了 compile
  • 为什么我在 Android Studio 3.2.1 中收到“所有 com.android.support 库必须使用完全相同的版本规范”?

    我读过这篇文章所有 com android support 库必须使用完全相同的版本规范 https stackoverflow com questions 42374151 all com android support librarie
  • PHP 行为和数组指针

    我正在阅读 PHP 手册 特别是each http php net each函数 并遇到以下警告 Caution因为将数组分配给另一个变量会重置原始数组的指针 所以如果我们将 fruit 分配给循环内的另一个变量 上面的示例将导致无限循环