【问题标题】:Laravel swap the position in collection - multidimensional arrayLaravel 交换集合中的位置 - 多维数组
【发布时间】:2018-08-07 22:35:36
【问题描述】:

以下是集合中的数组:

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 之外,什么都没有发生。

我知道我在某个地方犯了一个愚蠢的错误,但我无法找到在哪里以及如何找到。

谁能帮帮我?

【问题讨论】:

  • $paymentOptionCart->put($paymentType, $details);, $paymentType 您当前的paymentType 是吗?所以不动才有意义
  • @KendrickKesley 即使我这样做$request->option,它也永远不会改变.. 我不知道为什么..
  • 我只是在确认您是否将$paymentOptionCart->put($paymentType, $details); 中的$paymentType 更改为$request->option。你会得到与使用$paymentOptionCart->put($paymentType, $details);时相同的结果?
  • 请先告诉我们你是如何得到数组的
  • @KendrickKesley 是的,我确实得到了相同的结果..

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


【解决方案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]);
            }
        }
}

【讨论】:

  • 这里$array 是您首先给出的数组,我已经对其进行了测试,它应该可以工作
  • @SaiyanPrince 我已经用完整的测试代码更新了我的答案,您可以根据您的需要进行更改,因为我对您的完整数据一无所知
  • 嘿..你能解释一下你写的代码吗..我想知道我犯的错误(任何类型的)..我一直在尝试破解这个,因为没有任何结果..
【解决方案2】:

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

在一个在线订单中有两种不同的付款方式是一个不太可能的例子,还没有看到这种情况。人们可能宁愿发布两个订单(这意味着不仅业务逻辑有缺陷,而且数组结构的设计也很糟糕,需要这样乱来)。

xdebug 非常适合了解正在发生的事情。即使我的回答可能无法回答代码中的问题,一个可以复制和粘贴的问题(这不是我的工作),xdebug 也会告诉你问题出在哪里。

【讨论】:

    猜你喜欢
    • 2012-10-16
    • 2019-07-05
    • 1970-01-01
    • 2017-03-23
    • 2018-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-14
    相关资源
    最近更新 更多