从PHP7.1开始,foreach()表达式可以实现数组解构,作为解包行值的一种方式,并进行个性化的变量分配以供以后使用。当在foreach()循环的头/签名中使用数组解构时,是否可以声明新元素而不仅仅是访问新元素?举例来说:
foreach()
$array = [ ['foo' => 'a', 'bar' => 1], ['foo' => 'b', 'bar' => 2], ];
字符串我可以用new键在原始数组的每一行追加一个新元素吗?
new
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()赋值不能通过引用
cvxl0en22#
在我看来,应该是这样的:第一个月1.第一个怪癖foreach ($array as ['new' => &$x, 'bar' => $x])/*Where is 'new' ?*/;个我期望:致命错误:重新定义参数$xIMO最好这样写: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'];最后,这对我来说更具一致性:
foreach ($array as ['new' => &$x, 'bar' => $x])/*Where is 'new' ?*/;
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警告:重新定义参数$x1.第四个怪癖PHP解析器的析构规则类似于数组构造,但数组()一方面构造数据,同时也构造数据。在array('key'=>hydrate())结构/构造中,你可以调用一个字体,但在解构语法中,我无法想象。1.第五个怪癖为什么“&”在数组中创建一个新条目?这就是PHP的行为
foreach ($users as ['state' => $state, 'jobs' => &$ref[$state]]);
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']
foreach ($array as $x => ['new' => &$x])/* Where is my key $x ?*/;
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);
型
2条答案
按热度按时间9gm1akwq1#
是的,数据可以直接附加到
foreach()
头部的原始输入数组的行中。使用数组解构的一般好处是能够专门访问/隔离给定数组中的数据,而无需将不需要的数据加载到变量中。
详细信息:
&
的变量)--否则没有修改原始数组的指示。null
。产品编号:(Demo)
字符串
输出量:
型
使用上面的示例输入数组,可以使用无主体循环将第一级键分配为数组中的新列,而无需将整行声明为引用。代码:(Demo)
型
这种方法需要少声明一个全局范围的变量,而不是:
型
如果不通过引用进行修改,甚至不会使用
foreach()
签名所需的值变量。型
输出(来自所有):
型
这里是another answer that uses this technique and assigns values to the reference variables via another loop。
@Dharman在一个PHP内部线程中提到,没有
foreach()
的数组解构执行相同的行为。型
虽然不再支持,但建议我澄清一下,对于PHP7.1到PHP7.2,这种技术将导致致命错误。
致命错误:[]和list()赋值不能通过引用
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'];
最后,这对我来说更具一致性:
字符串
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的行为
型