Laravel 交换集合中的位置 - 多维数组
Laravel swap the position in collection - multidimensional array
集合中的数组如下:
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
之外没有任何反应。
我知道我在某个地方犯了一个愚蠢的错误,但我无法找到错误的位置和方式。
有人可以帮我吗?
这应该可以完成您的任务:
$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]);
}
}
}
unset($details[$c])
似乎是问题所在...这会在第一次迭代结束时删除索引 0 处的元素 - 然后索引 1 应变为索引 0,随后将无法访问在索引 1 处,在循环的下一次迭代期间。只是 运行 循环直到满足退出条件,然后将它们全部取消设置,而不是在循环期间......或向后循环,以保持索引完好无损;这将首先取消设置最后一个元素,并且循环不会超出数组边界。
在一个在线订单中有两个不同的支付选项是一个不太可能的例子,还没有看到这个。人们可能宁愿 post 两个命令(这意味着,不仅业务逻辑有缺陷,而且数组结构的设计也很糟糕,需要这样乱七八糟的)。
xdebug 非常适合理解正在发生的事情。即使我的回答可能无法回答您可以复制和粘贴的代码中的问题(这不是我的工作),xdebug 也会告诉您确切的问题所在。
集合中的数组如下:
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
之外没有任何反应。
我知道我在某个地方犯了一个愚蠢的错误,但我无法找到错误的位置和方式。
有人可以帮我吗?
这应该可以完成您的任务:
$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]);
}
}
}
unset($details[$c])
似乎是问题所在...这会在第一次迭代结束时删除索引 0 处的元素 - 然后索引 1 应变为索引 0,随后将无法访问在索引 1 处,在循环的下一次迭代期间。只是 运行 循环直到满足退出条件,然后将它们全部取消设置,而不是在循环期间......或向后循环,以保持索引完好无损;这将首先取消设置最后一个元素,并且循环不会超出数组边界。
在一个在线订单中有两个不同的支付选项是一个不太可能的例子,还没有看到这个。人们可能宁愿 post 两个命令(这意味着,不仅业务逻辑有缺陷,而且数组结构的设计也很糟糕,需要这样乱七八糟的)。
xdebug 非常适合理解正在发生的事情。即使我的回答可能无法回答您可以复制和粘贴的代码中的问题(这不是我的工作),xdebug 也会告诉您确切的问题所在。