无法修改数组元素值

时间:2013-11-21 21:25:37

标签: php arrays

我有一些循环遍历数组的代码,如果它的元素的数量大于1,则将该元素复制到与qty一样多的元素中,然后将所有元素的数量设置为1 (并进行一些其他更改。)

我已经盯着这个很长一段时间了,我相信我一定会错过一些明显的东西,因为我不能为了我的生活而改变我想要改变的价值观。

以下是基本代码:

foreach ($items as $id => $itm) {
    // if there's an item that has a qty > 1, need to split out into multiple nodes with qty = 1
    if ($itm['qty'] > 1) {
        $qtyCount = $itm['qty'];
        $newItems = array_fill($id, $qtyCount, $itm);

        foreach ($newItems as $newId => $n) {
            $n['qty'] = 1;
            $n['deal_id'] = $newId;
        }

        error_log("new items");
        error_log(print_r($newItems,1));
    }
}

我开始的是一个看起来像这样的数组:

[items] => Array
    (
        [0] => Array
            (
                [product] => AW8B
                [qty] => 1
                [subtotal] => 6.500
                [deal_id] => 
            )

        [1] => Array
            (
                [product] => C
                [qty] => 3
                [subtotal] => 30.000
                [deal_id] => 1
            )

        [2] => Array
            (
                [product] => QUEPAP
                [qty] => 1
                [subtotal] => 4.000
                [deal_id] => 
            )

    )

在这种情况下,只有原始项目数组中的元素1符合qty>的标准。 1,所以代码应该创建一个包含三个相同元素的新数组。然后foreach($newItems as $newId => $n)循环应循环遍历新的3元素数组,并将每个元素的qty元素设置为1,将deal_id元素设置为循环索引。我期望error_log(print_r($newItems,1))行返回的内容如下所示。

[newItems] => Array
(
    [1] => Array 
        (
            [product] => C
            [qty] => 1
            [subtotal] => 30.000
            [deal_id] => 1
        )

    [2] => Array
        (
            [product] => C
            [qty] => 1
            [subtotal] => 30.000
            [deal_id] => 2
        )

    [3] => Array
        (
            [product] => C
            [qty] => 1
            [subtotal] => 30.000
            [deal_id] => 3
        )
) 

但是,即使在内部foreach循环运行之后,qty仍为3并且所有这些的deal_id仍为1。这让我起了墙,因为我不是新手,而且以前做过这种事。只是不能为我的生活找出我在这里做错了什么。

2 个答案:

答案 0 :(得分:1)

要在foreach循环中直接修改数组,必须使用'&',如下所示:

foreach ($newItems as $newId => &$n) {
    ....
}

请参阅docs

答案 1 :(得分:1)

我会以Leonardo显示,但替代:

foreach ($newItems as $newId => $n) {
    $newItems[$newId]['qty'] = 1;
    $newItems[$newId]['deal_id'] = $newId;
}