将关联数组与匹配数组一起插入表键的最有效方法

时间:2017-06-06 10:31:04

标签: php mysql arrays pdo

给出以下数组;

[0] => array(
    col1 => val1,
    col2 => val2,
    col3 => val3
),
[2] => array(
    col1 => val1,
    col2 => val2,
    col3 => val3
),
[3] => array(
    col1 => val1,
    col2 => val2,
    col3 => val3
)

具有相同列名col1col2col3

的数据库表

将此插入数据库的最有效方法是什么?

我目前有这样的事情;

$i = 0;
$db_columns = '';

$column_values = array();

foreach ($rows as $k => $row)
{
    $columns = array();
    $fields = array();

    foreach ($row as $a => $b) 
    {
        $column_values[$a.$i] = $b;
        $columns[] = ':'.$a.$i;
        $fields[] = $a;
    }

    // build up sql values
    $db_columns .= ($db_columns ? ', ' : '').'('.implode(', ', $columns).')';

    $i++;
}

// perform insert
$sql = "INSERT INTO table (".implode(', ', $fields).") 
    VALUES $db_columns";

$query = $db->prepare($sql);
$status = $query->execute($column_values);

这将构建像这样的查询字符串;

INSERT INTO table (col1, col2, col3)
VALUES (:col10, :col20, :col30), (:col11, :col21, :col31), (:col12, :col22, :col32)

使用数组匹配绑定变量:col10:col20:col30:col11等...

所以一切都很好。它做我想要的和工作,但考虑到输入数组键与表匹配,我的代码似乎过于复杂。必须有一个更清洁的方法来做到这一点。

1 个答案:

答案 0 :(得分:1)

您可以使用问号参数简化一些代码。例如,顺便说一下:

$db_columns = '(' .  implode('),(', array_fill(0, count($rows), implode(',', array_fill(0, count($rows[0]), '?')))) . ')';

$sql = "INSERT INTO table (".implode(', ', array_keys($rows[0])).") 
    VALUES $db_columns";

$query = $db->prepare($sql);
$status = $query->execute($column_values);    
$query->execute(array_merge(...array_map('array_values', $rows)));

demo on eval.in