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

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

*经过十多年的PHP开发,我才发现这种可能性。


解决方案

A总是在赋值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,
)

新生成的数组具有基于原始值的前缀key,而原始索引将成为新值。

如果字符串前面没有prefix_,该操作实际上与array_flip()相同。


反转赋值使value变量接收key不能按预期工作。您可能希望生成["prefix_0", "prefix_1"],但它没有生成,而且由于试图访问未声明的变量,它还会生成通知/警告。(抱怨只出现在第一次迭代上,因为在第一次迭代之后,声明了$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',
)

对于其他上下文,我将提供另一个可用的示例,该示例使用值来确定输出数组中的数组键来生成多维数组。(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,
  ),
)

相关文章