Laravel交换集合中的位置 - 多维数组

时间:2018-02-28 06:02:53

标签: php arrays laravel multidimensional-array laravel-5.4

以下是集合中的数组:

array:1 [▼
  "online" => array:2 [▼
    "IS-003" => array:19 [▼
      "product" => Product {#831 ▶}
      "quantity" => 1
      "payment-option" => "online"
    ]
    "HA4" => array:19 [▼
      "product" => Product {#822 ▶}
      "quantity" => 1
      "payment-option" => "online"
    ]
  ]
]

每当用户更改payment-option时,上述数组都应该更改。

例如,如果HA4['payment-option']online更改为cod,那么父数组中应该有2个数组。 以下是我想要的数组。

array:2 [▼
  "online" => array:1 [▼
    "IS-003" => array:19 [▼
      "product" => Product {#831 ▶}
      "quantity" => 1
      "payment-option" => "online"
    ]
  ]
  "cod" => array:1 [▼
    "HA4" => array:19 [▼
      "product" => Product {#822 ▶}
      "quantity" => 1
      "payment-option" => "cod"
    ]
  ]
]

到目前为止我尝试过的但却无法获得所需的结果:

$paymentOptionCart = collect();

foreach ($cart as $paymentType => &$details) {
    foreach ($details as $c => $p) {
        if ($c == $code) {
            $details[$c]['payment-option'] = $request->option;
            $paymentOptionCart->put($paymentType, $details);

            unset($details[$c]);
        }
    }
}

执行上述代码时,除payment-option更新为cod外没有任何反应。

我知道我在某个地方犯了一个愚蠢的错误,但我无法确定在哪里和如何。

有人可以帮帮我吗?

2 个答案:

答案 0 :(得分:1)

这应该完成你的任务:

$array = [
        "online" => [
            "IS-003" => [
                "quantity" => 1,
                "payment-option" => "online"
            ],
            "HA4" => [
                "quantity" => 1,
                "payment-option" => "online"
            ]
        ]
    ];


$code = "HA4";
$request_option = "cod";

foreach ($array as $paymentType => $details) {
        foreach ($details as $c => $p) {
            if ($c == $code) {
                $array[$request_option][$c] = $p;
                $array[$request_option][$c]["payment-option"] = $request_option;
                unset($array[$paymentType][$c]);
            }
        }
}

答案 1 :(得分:0)

unset($details[$c])似乎是问题...这会在第一次迭代结束时在索引0处打出元素 - 然后索引1应该成为索引0,随后将无法在索引处访问1,在循环的下一次迭代期间。只需运行循环直到满足退出条件,然后将它们全部取消设置,而不是在循环期间...或循环向后,以保持索引完整;这将首先取消设置最后一个元素,并且循环不会超过数组边界。

在一个在线订单中有两个不同的付款选项是一个不太可能的例子,还没有看到这个。人们可能更愿意发布两个订单(这意味着,不仅业务逻辑存在缺陷,而且阵列结构还有一个令人遗憾的设计,需要这样的混乱)。

xdebug非常适合了解正在发生的事情。即使我的答案可能无法回答代码中的问题,也可以复制和解决问题。粘贴(这不是我的工作),xdebug将告诉你究竟是什么问题。