dongmuzhan4705 2016-05-07 12:34
浏览 800
已采纳

在foreach循环中删除数据

Using this array:

$arr=array(
   array('project','ProjectId','62c1553d'),
   array('project','ProjectName','TEST JSON'),
   array('Vendors','PrimeSpec','Fabspec'),
   array('Vendors','VendorId','dd759c7f'),
   array('Vendors','PrimeSpec','Vendor2'),
   array('Vendors','VendorId','Vendor2ID'),
);

The desired result is:

INSERT INTO project (ProjectId,ProjectName) VALUES (62c1553d,'TEST JSON');
INSERT INTO Vendors (PrimeSpec,VendorId) VALUES ('Fabspec',dd759c7f);
INSERT INTO Vendors (PrimeSpec,VendorId) VALUES ('Vendor2',Vendor2ID);

But I'm losing PrimeSpec, Fabspec in the foreach loop - the output I'm getting is:

INSERT INTO project (ProjectId,ProjectName) VALUES (62c1553d,TEST JSON);
INSERT INTO Vendors (VendorId) VALUES (dd759c7f);

Here is my code:

function array2sql($arr){
    $sql = '';
    $fields = '';
    $values = '';
    $extable = $arr[0][0];
    foreach( $arr as $line ) {
        if ($extable == $line[0]) {
            $fields .= $line[1].',';
            $values .= $line[2].',';
        } else {
            $sql .= 'INSERT INTO ' . $extable . ' (' . rtrim($fields, ',') . ') VALUES (' . rtrim($values, ',') . ');';
            $fields = '';
            $values = '';
            $extable = $line[0];
        }
    }
    $sql .= 'INSERT INTO ' . $extable . ' (' . rtrim($fields, ',') . ') VALUES (' . rtrim($values, ',') . ');';
    echo $sql;
    return $arr;
}

array2sql($arr);

I don't understand why it's dropping the first set of data. Thanks for looking at this.

  • 写回答

4条回答 默认 最新

  • douxu0550 2016-05-07 13:44
    关注

    Consider the following simplified version of your array2sql function(using array_walk and array_column functions):

    function array2sql($arr) {
        $query_data = [];
        $sql = "";
    
        array_walk($arr, function($v) use(&$query_data) {
            $query_data[$v[0]][$v[1]][] = $v[2];
        });
        foreach ($query_data as $table => $data) {
            $keys = array_keys($data);
            $key_string = implode(",", $keys);
            $count = count($data[$keys[0]]);  // number of values for a certain column
            while ($count--) {
                $value_string = "'". implode("','", array_column($data, $count)). "'";
                $sql .= "INSERT INTO $table($key_string) VALUES($value_string);". PHP_EOL;
            }
        }    
        return $sql;
    }
    
    print_r(array2sql($arr));
    

    The output:

    INSERT INTO project(ProjectId,ProjectName) VALUES('62c1553d','TEST JSON');
    INSERT INTO Vendors(PrimeSpec,VendorId) VALUES('Vendor2','Vendor2ID');
    INSERT INTO Vendors(PrimeSpec,VendorId) VALUES('Fabspec','dd759c7f');
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

悬赏问题

  • ¥15 素材场景中光线烘焙后灯光失效
  • ¥15 请教一下各位,为什么我这个没有实现模拟点击
  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
  • ¥15 ubuntu子系统密码忘记
  • ¥15 保护模式-系统加载-段寄存器