首页 > 解决方案 > 数组函数不使用 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"

https://3v4l.org/6sTm9

标签: phparraysarrow-functions

解决方案


手册

按值绑定意味着不能从外部范围修改任何值

和:

箭头函数自动按值捕获变量...当表达式中使用的变量在父范围内定义时,它将被隐式按值捕获

因此,您的函数无法修改 的值$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"

3v4l.org 上的演示

如果您愿意传递参数,可以使用箭头函数:

$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"

3v4l.org 上的演示


推荐阅读