正在删除foreach循环中的数据


Dropping data in foreach loop

使用此数组:

$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'),
);

期望的结果是:

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);

但我在foreach循环中失去了PrimeSpecFabspec-我得到的输出是:

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

这是我的代码:

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);

我不明白它为什么要丢弃第一组数据。谢谢你看这个。

考虑以下array2sql函数的简化版本(使用array_walkarray_column函数):

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));

输出:

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');

似乎可以通过将else语句更改为来解决

    $fields = $line[1].',';
    $values = $line[2].',';

试试这个

function array2sql($arr){
    $sql = '';
    $newArr = array();
    foreach( $arr as $line ) {
        $newArr[$line[0]][$line[1]] = $line[2];
    }
    foreach($newArr as $tblNam=>$value) {
        $sql .= "INSERT INTO ".$tblNam." (`" . implode('`,`', array_keys($value)) . "`) VALUES ('" . implode("','", array_values($value)) . "') ";
    }
    echo $sql;
}

因为表每个只接收两列数据,array_chunk()可以帮助合并、准备和组合查询。

$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'),
);
// merge and prepare
foreach(array_chunk($arr,2) as $pair){
    if(!isset($queries[$pair[0][0]]['columns'])){
        $merge[$pair[0][0]]['columns']='`'.implode('`,`',array_column($pair,1)).'`';
    }
    $merge[$pair[0][0]]['values'][]="'".implode("','",array_column($pair,2))."'";
}
// compose queries
foreach($merge as $table=>$a){
    $queries[$table]="INSERT INTO $table ({$a['columns']}) VALUES (".implode('),(',$a['values']).")";
}
print_r($queries);
/*
Array(
    [project] => INSERT INTO project (`ProjectId`,`ProjectName`) VALUES ('62c1553d','TEST JSON')
    [Vendors] => INSERT INTO Vendors (`PrimeSpec`,`VendorId`) VALUES ('Fabspec','dd759c7f'),('Vendor2','Vendor2ID')
)
*/
$mysqli->multi_query(implode(';',$queries));
while ($mysqli->next_result()) {;} // flush multi_queries

此方法不执行任何转义或安全措施。如果要使用准备好的语句和占位符,则需要进行一些修改。

有关如何编写完整的mysqli_multi_query()INSERT块的更多详细信息,请参阅以下链接:严格标准:mysqli_multi_6query 出现mysqli_next_result()错误