php - 数组函数不使用 array_shift() 进行迭代
问题描述
下面,调用箭头函数时,为什么我只得到第一个条目?
<?php
$stack = array("orange", "banana", "apple", "raspberry");
$fruit = fn() => array_shift($stack);
var_dump($fruit());
var_dump($fruit());
var_dump($fruit());
var_dump($fruit());
给出:
string(6) "orange"
string(6) "orange"
string(6) "orange"
string(6) "orange"
解决方案
从手册:
按值绑定意味着不能从外部范围修改任何值
和:
箭头函数自动按值捕获变量...当表达式中使用的变量在父范围内定义时,它将被隐式按值捕获
因此,您的函数无法修改 的值$stack
,因此每次都返回相同的值。要执行您想要的操作(没有函数参数),您需要一个匿名函数:
$fruit = function () use (&$stack) { return array_shift($stack); };
var_dump($fruit());
var_dump($fruit());
var_dump($fruit());
var_dump($fruit());
输出:
string(6) "orange"
string(6) "banana"
string(5) "apple"
string(9) "raspberry"
如果您愿意传递参数,可以使用箭头函数:
$stack = array("orange", "banana", "apple", "raspberry");
$fruit = fn(&$s) => array_shift($s);
var_dump($fruit($stack));
var_dump($fruit($stack));
var_dump($fruit($stack));
var_dump($fruit($stack));
输出:
string(6) "orange"
string(6) "banana"
string(5) "apple"
string(9) "raspberry"
推荐阅读
- go - Gorm 无缘无故返回已删除的值
- java - 为什么带有自定义 DateTimeFormatter 模式的 LocalDate 错误地设置了带区域的时间?
- javascript - 在页脚滚动上保持固定
- vba - TreeView1_NodeCheck 编译错误:过程声明与具有相同名称的事件或过程的描述不匹配
- ios - SwiftUI 中用于两个方向的 Google AdMob 智能横幅
- r - rvest 提取内部链接
- reactjs - 在 Cypress 中使用 redux-thunks
- java - JAVA 从 ISO_DATE_TIME 获取自 Epoch 以来的毫秒数
- vb.net - 从文本框 VB.net 填充 DataGrid
- python - 使用 GPU 训练 ResNet 模型时发现 OMM 错误