【问题标题】:Search Values by keys in multidimensional array and save them in database在多维数组中按键搜索值并将其保存在数据库中
【发布时间】:2020-07-05 12:57:45
【问题描述】:

我有一个多维或嵌套的数组,我不确定正确的词。问题是我正在尝试查找一个特定的键,返回它的值并将其存储在我的数据库中一次迭代。这是我一直在尝试的,但是当我只需要 1 行时,却在我的数据库中创建了很多行。

  $arr = $json['confirmed_by_province'];

    foreach ($arr as $province) {
        $confirmedByStates = new ConfirmedByProvinces();
        foreach ($province as $key => $value) {
            if($key == 'ON') {
                $confirmedByProvinces->ontario = $value;
            }
            if($key == 'QB') {
                $confirmedByProvinces->quebec = $value;
            }
            $confirmedByProvinces->save();
        }
    };

这是 $arr 变量的数据:

 array:31 [
  0 => array:1 [
    "ON" => "60"
  ]
  1 => array:1 [
    "QB" => "46"
  ]

【问题讨论】:

  • 您只需将$confirmedByProvinces->save(); 移到foreach 循环之外。
  • 你永远不会有$arr = [0 => ['ON' => '60', 'QB' => '46'], ['ON' => '52', 'QB' => '38']] - 两者都在外部数组的一个元素下 - 换句话说,元素中总是只有一个选择?
  • @DanielJonguitud 如果您回答这个问题,我或许可以为您提供更快的解决方案。问题是:数组 31 的元素可以有两个键吗?
  • @Tpojka 它实际上是一个包含 31 个键的数组,其中包含另一个键。我实际上解决了我的问题并标记了解决方案。感谢您的帮助!
  • 也许你在我的回答中发现了一些有趣的东西,谁知道呢。 :)

标签: php arrays laravel multidimensional-array


【解决方案1】:

$province 数组之外使用$confirmedByProvinces->save(); 方法。

     foreach ($arr as $province) {
        $confirmedByStates = new ConfirmedByProvinces();
        foreach ($province as $key => $value) {
            if($key == 'ON') {
                $confirmedByProvinces->ontario = $value;
            }
            if($key == 'QB') {
                $confirmedByProvinces->quebec = $value;
            }

        }
        $confirmedByProvinces->save();
    };

【讨论】:

  • 非常感谢您的回答,@james 的解释也非常好。我想补充一点,即使我按照你的建议做了我也必须将我的新模型声明移到 for 循环之外。
【解决方案2】:

问题源于你的循环,如果我们真的停下来看看发生了什么,它会更有意义:

foreach ($arr as $province) {
    $confirmedByStates = new ConfirmedByProvinces();
    foreach ($province as $key => $value) {
        if($key == 'ON') {
            $confirmedByProvinces->ontario = $value;
        }
        if($key == 'QB') {
            $confirmedByProvinces->quebec = $value;
        }
        $confirmedByProvinces->save();
    }
};

对于每次迭代,您都会更新一个名为 ConfirmedByProvinces 的新模型:

foreach ($arr as $province) {
    $confirmedByStates = new ConfirmedByProvinces();
//...

在每次迭代结束时,您将调用save()

foreach ($arr as $province) {
//...
    $confirmedByProvinces->save();

正如您现在所见,外循环的每次迭代都会新建一个 ConfirmedByProvinces 模型实例,然后将其保存在内循环中,从而为数组中的条目生成多行。

@DilipHirapara 的回答将解决您的问题,但我认为更深入的解释可以清楚地说明为什么这是一个问题。

【讨论】:

  • 你得到了我的 +1。完美的解释:)
  • 谢谢你的解释,这真的有助于我更好地理解我的错误在哪里以及我到底在做什么
【解决方案3】:

尽可能避免在 foreach 循环中执行 power DB 操作。在这种情况下,您可以将所有 from 循环设置为数组并在一个查询中将其保存到数据库中:

$insert = [];
foreach ($arr as $k => $province) {
    foreach ($province as $key => $value) {
        if ($key == 'ON') {
            $insert[$k]['ontario'] = $value;
        }
        if ($key == 'QB') {
            $insert[$k]['quebec'] = $value;
        }
    }
    // add timestamps here if needed since insert() method doesn't make that automatically
    // $insert[$k]['created_at'] = \Carbon\Carbon::now();
    // $insert[$k]['updated_at'] = \Carbon\Carbon::now();
}

if (!empty($insert)) {
    $confirmedByStates = new ConfirmedByProvinces();
    $confirmedByStates->insert($insert); // one I/O with DB
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-10-23
    • 1970-01-01
    • 2023-03-28
    • 2019-10-29
    • 1970-01-01
    • 1970-01-01
    • 2014-04-16
    • 2019-02-20
    相关资源
    最近更新 更多