Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 发电机中的键铸造_Php_Arrays_Generator_Yield - Fatal编程技术网

Php 发电机中的键铸造

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] 现在,让我们在生成器函数中尝试这一点,并逐个生成数组键,看看会发生什么

让我以一段关于数组键的引文开始这个问题

如果未指定键,则取现有整数索引的最大值,新键将为该最大值加1(但至少为0)。如果还不存在整数索引,则键将为0(零)

因此,让我们在以下代码中尝试这一点:

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的源代码。