在 foreach() 表达式中,值是在键之前还是之后定义的?

Within a foreach() expression, is the value defined before or after the key?

在单词 as 之后的经典 foreach() 循环中,是否可以将 key 变量用作 value 变量的一部分,反之亦然?

*经过PHP十多年的发展,这个可能性我现在才想到去调查。

A foreach() 总是在分配 key 变量之前分配 value 变量。 (Demo)

这似乎有点违反直觉,因为 $v 在视觉上似乎是在 之后声明的 它是通过 key 声明访问的。

这意味着您可以安全地使用:

$array = ['a', 'b'];
$result = [];
foreach ($array as $result["prefix_$v"] => $v);
var_export($result);

生产:

array (
  'prefix_a' => 0,
  'prefix_b' => 1,
)

新生成的数组有基于原始值的前缀键,原始索引成为新值。

没有在字符串前添加 prefix_,操作实际上与 array_flip() 相同。


反转分配以使 value 变量接收 key 无法按预期工作。您可能希望生成 ["prefix_0", "prefix_1"] 但它没有生成,并且由于尝试访问未声明的变量,它还会生成 Notices/Warnings 。 (投诉仅针对第一次迭代,因为在第一次迭代之后,声明了 $k —— 它是前一次迭代的键。)

$array = ['a', 'b'];
$result = [];
foreach ($array as $k => $result["prefix_$k"]);
// not defined on first iteration -------^^
var_export($result);

不好输出:

Warning: Undefined variable $k in /in/iVm1u on line 6
array (
  'prefix_' => 'a',
  'prefix_0' => 'b',
)

对于其他上下文,我将提供另一个工作示例,该示例生成一个 multi-dimensional 数组,使用该值来确定输出数组中的数组键。 (Demo)

$array = [2, 3, 5];

$result = [];
foreach ($array as $result[$v * $v][$v] => $v);
var_export($result);

输出:

array (
  4 => 
  array (
    2 => 0,
  ),
  9 => 
  array (
    3 => 1,
  ),
  25 => 
  array (
    5 => 2,
  ),
)