php 当在foreach()循环的头部解构数组数据时,可以将新元素分配给原始输入数组吗?

xdnvmnnf  于 2024-01-05  发布在  PHP
关注(0)|答案(2)|浏览(134)

从PHP7.1开始,foreach()表达式可以实现数组解构,作为解包行值的一种方式,并进行个性化的变量分配以供以后使用。
当在foreach()循环的头/签名中使用数组解构时,是否可以声明新元素而不仅仅是访问新元素?
举例来说:

$array = [
    ['foo' => 'a', 'bar' => 1],
    ['foo' => 'b', 'bar' => 2],
];

字符串
我可以用new键在原始数组的每一行追加一个新元素吗?

9gm1akwq

9gm1akwq1#

是的,数据可以直接附加到foreach()头部的原始输入数组的行中。
使用数组解构的一般好处是能够专门访问/隔离给定数组中的数据,而无需将不需要的数据加载到变量中。
详细信息:

  • 新元素必须通过引用声明(值必须是前缀为&的变量)--否则没有修改原始数组的指示。
  • 如果引用变量之后没有被赋值,默认值将是null

产品编号:(Demo

$array = [
    ['foo' => 'a', 'bar' => 1],
    ['foo' => 'b', 'bar' => 2],
];

foreach ($array as ['new' => &$x, 'bar' => $x]);

var_export($array);

字符串
输出量:

array (
  0 => 
  array (
    'foo' => 'a',
    'bar' => 1,
    'new' => 1,
  ),
  1 => 
  array (
    'foo' => 'b',
    'bar' => 2,
    'new' => 2,
  ),
)


使用上面的示例输入数组,可以使用无主体循环将第一级键分配为数组中的新列,而无需将整行声明为引用。代码:(Demo

foreach ($array as $x => ['new' => &$x]);


这种方法需要少声明一个全局范围的变量,而不是:

foreach ($array as $x => &$row) {
    $row['new'] = $x;
}


如果不通过引用进行修改,甚至不会使用foreach()签名所需的值变量。

foreach ($array as $x => $row) {
    $array[$x]['new'] = $x;
}


输出(来自所有):

array (
  0 => 
  array (
    'foo' => 'a',
    'bar' => 1,
    'new' => 0,
  ),
  1 => 
  array (
    'foo' => 'b',
    'bar' => 2,
    'new' => 1,
  ),
)


这里是another answer that uses this technique and assigns values to the reference variables via another loop
@Dharman在一个PHP内部线程中提到,没有foreach()的数组解构执行相同的行为。

$arr = [];
['foo' => &$v] = $arr;
$v = 1;
var_export($arr);
// output: array('foo' => 1)


虽然不再支持,但建议我澄清一下,对于PHP7.1到PHP7.2,这种技术将导致致命错误。
致命错误:[]和list()赋值不能通过引用

cvxl0en2

cvxl0en22#

在我看来,应该是这样的:
第一个月
1.第一个怪癖
foreach ($array as ['new' => &$x, 'bar' => $x])/*Where is 'new' ?*/;
我期望:
致命错误:重新定义参数$x
IMO最好这样写:
foreach ($array as &['new' => &$x, 'bar' => $y]) $y = $x;// affecting $array content;
类似foreach($array as $key=>$row) $x = &$array[$key]['new']; $y=$array[$key]['bar']=$x;
或者:
foreach ($array as ['new' => $x, 'bar' => &$y]) $y = $x;// affecting $array content几乎像foreach($array as $key=>$row) $y = &$array[$key]['bar']; $y = $array[$key]['new'];
最后,这对我来说更具一致性:

<?php
foreach ($array as ['new' => &$x, 'bar' => $y=$x]);

字符串
1.第二个怪癖
foreach ($users as ['state' => $state, 'jobs' => &$ref[$state]]);
我期望:
分析错误:语法错误,意外的标记“[",应为“)”
IMO最好这样写:
foreach ($users as ['state' => $state, 'jobs' => &$job]) $ref[$state]=$job;
或者:
foreach ($users as &['state' => $state, 'jobs' => $jobs]) $ref[$state]=&$jobs;// Keept a reference of $users[0]['jobs']
1.第三个怪癖
foreach ($array as $x => ['new' => &$x])/* Where is my key $x ?*/;
我期望:
PHP警告:重新定义参数$x
1.第四个怪癖
PHP解析器的析构规则类似于数组构造,但数组()一方面构造数据,同时也构造数据。
在array('key'=>hydrate())结构/构造中,你可以调用一个字体,但在解构语法中,我无法想象。
1.第五个怪癖
为什么“&”在数组中创建一个新条目?
这就是PHP的行为

function foo($new, int $old) {
    $ref = "Quirikou";
}
$trendly = ['old'=>0];
foo($trendly['new'], $trendly['old']);// Warning: Undefined array key "new" in
var_dump($trendly);

function baz(&$new, int $old) {
    $ref = "Quirikou";
}
$trendly = ['old'=>0];
baz($trendly['new'], $trendly['old']);

var_dump($trendly);

相关问题