【问题标题】:Getting a an array from for loop and use another for loop with that array in PHP从 for 循环中获取一个数组并在 PHP 中对该数组使用另一个 for 循环
【发布时间】:2018-05-09 00:08:20
【问题描述】:

我有一个for循环,会在循环中形成两个数组

foreach ($data as $key => $value) {
........
........
$user_insert[] = [
        'keyy' => $value,
        'key' => $value,
        ....
        ...
        ...
    ];
$someArray1[] = [
        /*'user_id' => $insert_id,*/
        'key1' => $value1,
        'keyy' => $value,
        .......
        ........
    ];
}

$user_insert[] 数组的计数为 4,$someArray1 的计数为 15。

在这个 for 循环之后,我需要将 $user_insert 数组数据插入数据库并使用该 insert_id 插入下一个数组 $someArray1

foreach($user_insert as $insert_user){
    $unique_user_insert = array_unique($insert_user);
    //dd($unique_user_insert);
    $insert_id = DB::table('users')->insertGetId($unique_user_insert);

    foreach ($someArray1 as $someArray) {
        $someArray['user_id'] = $insert_id;
        DB::table('table_name')->insert($someArray);
    }
}

所以这里的问题是第二个循环中的数据插入了 60 次(4 * 15)。我只需要插入 15 行。

数据($someArray1) 来自第一个 for 循环,但我需要在第二个 for 循环中插入操作后得到的数组中添加一个 user_id

那么我怎样才能只插入 15 行。

【问题讨论】:

  • 你怎么知道哪个 userid 和哪个 somearray1 对应?
  • 在第二个 for 循环中,插入数据,last_inserted Id 将是 $someArray1 中的 user_id。 $insert_id = DB::table('users')->insertGetId($unique_user_insert);
  • @EdmCoff 有道理。目前尚不清楚插入的目标是什么。在阅读了你的问题几次之后,我不明白为什么你需要带有 $someArray1 的内部 foreach。看来您应该将插入的 ID 从 foreach($user_insert) 存储在一个变量中,然后在 foreach($user_insert) 完成后执行插入(您尝试在 foreach($someArray1) 中执行此操作。
  • 我们知道您正在使用从插入语句中获得的那些 ID。 @EdmCoff 意味着您的内部循环不一定会使用正确的 key=>value 对来存储。

标签: php mysql arrays laravel-5


【解决方案1】:

我将假设您能够使用 $insert_id 值访问您的 $someArray1 以找到适当的用户数据。

foreach($user_insert as $insert_user){
    $unique_user_insert = array_unique($insert_user);
    $insert_id = DB::table('users')->insertGetId($unique_user_insert);

    // Get the user information you need as $someArray1 should be user_id=>data
    $userData = $someArray[$insert_id];
    $userData['user_id'] = $insert_id;
    // No need for an inner loop, just access the necessary properties of the loop you created earlier.
    DB::table('table_name')->insert($userData);
}

您的标签表明您也在使用 Laravel 5。如果您使用的是 eloquent ORM,则可以通过为您的数据库表创建模型来清理一些插入和 ID 检索。

【讨论】:

    【解决方案2】:

    实际上,每次处理来自$user_insert 的行时,都会循环遍历$someArray1,而不是只获取所需的行。

    关键是要了解您需要的线路。尽我所能理解您的代码,我想说最简单(最易读)的方法是使用 for 循环,而不是 foreach 循环:

        for( $i = 0, $iMax = count( $user_insert ); $i < $iMax; ++$i ){
            $insert_user = $user_insert[$i];
    
            // Put your `$user_insert` insert code here
    
            $someArray1[$i]['user_id'] = $insert_id;
            DB::table('table_name')->insert( $someArray[$i] ); // Note the [$i] here
        }
    

    您也可以通过请求索引来使用 foreach 来做到这一点:

        foreach( $user_insert as $i => $insert_user ){
            $unique_user_insert = array_unique($insert_user);
            //dd($unique_user_insert);
            $insert_id = DB::table('users')->insertGetId($unique_user_insert);
    
            // Now use $i requested above :
            $someArray1[$i]['user_id'] = $insert_id;
            DB::table( 'table_name' )->insert( $someArray1[$i] );
        }
    

    【讨论】:

    • @Juline P 我跟随 foreach 请求索引。但随后只能在“table_name”表名中插入 4 行。实际上,$someArray1 中有 15 行,$user_insert 数组中有 4 行,因为在 user_insert 中循环,我只能添加 4 个值桌子。
    • 我的错!我带你去取$someArray[$i] 而不是$someArray1[$i]!我更正了示例代码。那是错误吗?
    • 数组名不是问题,数据个数是问题。 @Juline P 我需要插入 15 个值,在表中所有这些值都会有 4 个 user_id,所以这个循环 $user_insert as $i =&gt; $insert_user 将得到 4 个 user_ids ,所以需要插入一个包含 15 个值的表和这些 user_ids。但我只能插入四个值。我明白了吗?
    • 您反思的第二部分:这是我对您的代码的理解开始失败的地方;)在您的示例中,$user_insert$someArray1 应该具有相同数量的行,但 $user_insert[$i]$someArray1[$i] 可能不会。然后我假设$user_insert 中的第一个元素对应于$someArray1 中的第一个元素。假设$user_insert$someArray1 的长度不同。两个数组有什么关系?
    • $user_insert 有 4 个,$someArray1 有 15 个
    猜你喜欢
    • 1970-01-01
    • 2021-12-29
    • 1970-01-01
    • 2021-11-25
    • 2014-03-21
    • 2018-12-08
    • 2019-08-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多