【问题标题】:Within a foreach() expression, is the value defined before or after the key?在 foreach() 表达式中,值是在键之前还是之后定义的?
【发布时间】:2022-02-08 16:33:43
【问题描述】:

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

*经过十多年的PHP开发,这种可能性我才刚刚想到去调查。

【问题讨论】:

    标签: php foreach key variable-assignment key-value


    【解决方案1】:

    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"],但它不会,并且由于尝试访问未声明的变量,它还会生成通知/警告。 (投诉只针对第一次迭代,因为在第一次迭代之后,$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,
      ),
    )
    

    【讨论】:

    • 可能需要注意的是,这也适用于list() - 3v4l.org/JCSIi
    • 是的,原创性 我有一个更复杂的例子,使用这样的数组解构,但最后我决定尝试制作最简单的演示来减少混淆。这种技术有点像array_flip()array_column() 的融合。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-19
    • 2011-05-28
    • 2011-04-22
    • 1970-01-01
    相关资源
    最近更新 更多