Php 发电机中的键铸造
让我以一段关于数组键的引文开始这个问题 如果未指定键,则取现有整数索引的最大值,新键将为该最大值加1(但至少为0)。如果还不存在整数索引,则键将为0(零) 因此,让我们在以下代码中尝试这一点:Php 发电机中的键铸造,php,arrays,generator,yield,Php,Arrays,Generator,Yield,让我以一段关于数组键的引文开始这个问题 如果未指定键,则取现有整数索引的最大值,新键将为该最大值加1(但至少为0)。如果还不存在整数索引,则键将为0(零) 因此,让我们在以下代码中尝试这一点: print_r(['4'=> 1, 2, 3]); // output: Array([4] => 1 [5] => 2 [6] => 3) *请注意,数组中的第一个键是字符串,PHP将其转换为整数类型[4] 现在,让我们在生成器函数中尝试这一点,并逐个生成数组键,看看会发生什么
print_r(['4'=> 1, 2, 3]); // output: Array([4] => 1 [5] => 2 [6] => 3)
*请注意,数组中的第一个键是字符串,PHP将其转换为整数类型[4]
现在,让我们在生成器函数中尝试这一点,并逐个生成数组键,看看会发生什么
function foo() {
yield '4' => 1;
yield 2;
yield 3;
}
print_r(iterator_to_array(foo()));// output: Array([4] => 1 [0] => 2 [1] => 3)
我知道生成器的行为不像数组,但让我们看看当第一个键实际上是整数时会发生什么:
function foo() {
yield 4 => 1; // Note 4 here is an integer
yield 2;
yield 3;
}
print_r(iterator_to_array(foo())); // output: Array([4] => 1 [5] => 2 [6] => 3)
输出与预期一致
那么,为什么只有当PHP在生成器中强制转换键时才会发生这种情况呢?这是正常行为吗?如果数组中的键是数字字符串,则PHP会将其转换为整数类型。在生成器中,数字字符串键不会强制转换为整数。如果要保留键类型,则不能使用迭代器\u to\u数组函数
function foo() {
yield '4' => 1;
yield 2;
yield 3;
}
foreach(foo() as $key => $value){
var_dump($key);
}
输出:
string(1) "4"
int(0)
int(1)
我的回答不好,我无法解释你发现了什么,但在我看来这是一种正常的行为,因为在Yield关键字后面有一个叫做Generator exist的对象(它实现了迭代器),所以基本上,在这个对象中存在对键的处理。“在generators中,数字字符串键不会转换为整数”你知道为什么吗?。这就是生成器在PHP中实现的方式,还是一个bug?我认为行为如图所示,而不是bug。要知道生成器键是如何在PHP中实现的,必须学习PHP的源代码。