赋值运算符任一端函数的执行顺序

Order of execution for functions on either side of the assignment operator

提问人:caijw 提问时间:4/11/2023 最后编辑:mickmackusacaijw 更新时间:4/11/2023 访问量:80

问:

我想实现一个函数

$input = ['key1', 'value1', 'key2', 'value2'];
// $output = ['key1' => 'value1', 'key2' => 'value2'];
$output=[];
do {
    $output[current($input)] = next($input);
} while (next($input));

我凭直觉写了这段代码,但是当我今天回顾这段代码时,我思考这是否可能是一个错误。

我假设输出应该是这样的:

['value1'=>'value1','value2'=>'value2']

因为优先于 ,但这个函数在 PHP8 中工作正常。next()current()

为什么会这样?分配不是从右到左吗?

运算符优先级 php-8 执行顺序

评论

3赞 Tangentially Perpendicular 4/11/2023
你还没有解释你认为有问题的任何PHP版本得到什么输出,或者你认为哪个版本的PHP有错误。像这样的代码的问题在于,你可能认为它优雅而聪明,但显然PHP并不清楚它的目的。一些可怜的灵魂在你身后出现,也可能不明白。始终追求清晰。总是。
0赞 Tangentially Perpendicular 4/11/2023
我在 3v4l 中尝试过这个,它在每个 PHP 版本中都产生了相同的输出,直到 5.4。PHP5.3 失败了,因为它不喜欢简写数组表示法。我认为问题出在你的脑海里。
0赞 caijw 4/11/2023
对不起,我的表情有问题。我的意思是不是哪个版本的php会有不同的输出,而是我认为赋值运算符是从右到左操作的,所以它应该在执行current之前执行next,但实际上在操作中,current是先后next(至少在php8中),这是我的疑问,为什么操作逻辑是从右到左, 但是执行顺序不是这样的@TangentiallyPerpendicular我只是出于好奇,将逻辑更改为以下 $key = current($input);$output[$key] = 下一个($input);
0赞 mickmackusa 4/11/2023
关于这个话题,有点:在 foreach() 表达式中,值是在键之前还是之后定义的?
0赞 mickmackusa 4/12/2023
简明的替代方法:array_column(array_chunk($input, 2), 1, 0) 和销毁密钥:array_column(array_chunk($input, 2), 1, 1)

答:

2赞 nice_dev 4/11/2023 #1

对于您的情况,关联性从左到右。您可以使用以下代码片段进行交叉检查,其中首先打印而不是 .=t1t2

<?php

$output=[];

$output[test('t1')] = test('t2');

function test($str){
    echo $str,PHP_EOL;
    return rand(10, 100);
}

演示

因此,您的输出是因为给出并推进内部数组指针并返回元素值,该元素值是,并且重复相同的值,直到数组完全循环。[ 'key1' => 'value1','key2' => 'value2']current()key1next()value1

评论

1赞 caijw 4/11/2023
首先,谢谢你回答我关于谁先执行的问题,也许我把分配顺序和执行顺序混淆了其次,对不起,我对描述有问题。我想要的结果是 ['key'=>'value'],但我在标题中提到的只是我认为这段代码的执行结果应该是 ['value'=> 'value'] @mickmackusa
0赞 nice_dev 4/11/2023
@caijw 很公平。我删除了不相关的部分。