簡體   English   中英

PHP foreach 中的參考變量有問題

[英]PHP something wrong with refrence variable in foreach

我有這樣的數據:

$a = [
"attr1"=> null,
"list"=> [
    [
        "other_attr"=> 47,
        "personal"=> [
            [
                "id"=> 3071,
                "quantity"=> 4,
                "price"=> 340000
            ]
        ]
    ],
    [
        "other_attr"=> 47,
        "group"=> [
            [
                "id"=> 3086,
                "quantity"=> 2,
                "price"=> 350000
            ]
        ]
    ]
]];

並與 function 波紋管:

foreach( $a['list'] as &$value ){
if (!empty($value["personal"])) {
    foreach ($value["personal"] as &$item) {
        $item['F'] = "TREDA";
    }
    foreach ($value["personal"] as $item) {
        print("do some thing here with new attribute F\n");
    }
    $value["C"] = 32213;
}
 if (!empty($value["group"])) {
     foreach  ($value['group'] as $item) {
         print("Do some thing here\n");
     }
    $value["C"] = "AAAA";
}
}

在 function 之后期望$a 的結果如下:

{"attr1":null,"list":[{"other_attr":47,"personal":[{"id":3071,"quantity":4,"price":340000,"F":"TREDA"}],"C":32213},{"other_attr":47,"group":[{"id":3086,"quantity":2,"price":350000}],"C":"AAAA"}]}

但實際數據錯誤如下:

{"attr1":null,"list":[{"other_attr":47,"personal":[{"id":3086,"quantity":2,"price":350000}],"C":32213},{"other_attr":47,"group":[{"id":3086,"quantity":2,"price":350000}],"C":"AAAA"}]}

Id 3071已被Id 3086替換。

任何人都可以在這里解釋我有什么問題嗎?

感謝幫助!

鏈接PHPOnline Sandbox中的 P/S 代碼演示

正如您所發現的,通過引用傳遞可能是一種危險的游戲。 這可能並不明顯,但您在此循環中創建了對$item的引用:

foreach ($value["personal"] as &$item) {

然后它繼續引用$value["personal"]中的第一個條目,即使您不再處於該循環中。 因此,這意味着稍后在您的代碼中執行以下操作:

foreach ($value['group'] as $item) {

您正在引用相同的$item變量(這是對$value["personal"]中的條目的引用。

因此, personal內部的條目被替換為group內部的條目。

如果您真的不需要引用,則最好(並且更安全)使用數組索引來更改值,例如

foreach ($value["personal"] as $index => $item) {
    $item['F'] = "TREDA";
    $value['personal'][$index] = $item;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM