具有不同最终循环的Foreach

时间:2018-11-12 00:52:15

标签: php arrays

我正在尝试创建一个foreach循环,该循环会更改两个变量的值。循环的最后一次迭代稍有不同(最后删除了逗号)-我似乎无法使其正常工作。

这是我到目前为止所拥有的

$rego_columns = [
    "make", 
    "model", 
    "year",
    "rego",
];

    foreach ($rego_columns as $key => $regcolex) {
     if ($key === key($rego_columns)){
        $table_values = "'".$record["$regcolex"]."'";
        $table_columns = "`.$regcolex.`"; 
    } else {
        $table_values = "'".$record["$regcolex"]."',";
        $table_columns = "`.$regcolex.`,"; 
    }
}

1 个答案:

答案 0 :(得分:1)

由于您正在有效地尝试将$record映射到您的$rego_columns,因此建议使用array_map来检索值。

然后,您可以使用implode在数组值周围添加环绕引号或反引号。

示例https://3v4l.org/h70pO

$rego_columns = [
    "make", 
    "model", 
    "year",
    "rego",
];

$record = ['make' => 'A', 'model' => 'B', 'year' => 'C', 'rego' => 'D'];

$tableValues = array_map(function($r) use ($record) {
    return $record[$r];
}, $rego_columns);

$tableColumns = '`' . implode('`,`', $rego_columns) . '`';
$tableValues = '"' . implode('","', $tableValues) . '"';


echo 'INSERT INTO table_name (' . $tableColumns . ') VALUES (' . $tableValues . ')';

结果

INSERT INTO table_name (`make`,`model`,`year`,`rego`) VALUES ("A","B","C","D");

如果由于某种原因需要在表格列值周围包含点,请将implode更改为:

$tableColumns = '`.' . implode('.`,`.', $rego_columns) . '.`';
$tableValues = '"' . implode('","', $tableValues) . '"';

结果:https://3v4l.org/1DI76

INSERT INTO table_name  (`.make.`,`.model.`,`.year.`,`.rego.`) VALUES ("A","B","C","D")

作为一个旁注,我强烈建议每当对数据库使用可变数据时都使用prepared statements。并将其映射到占位符。

示例https://3v4l.org/kcl4m

$tableValues = array_map(function($r) use ($record) {
    return $record[$r];
}, $rego_columns);
$placeholders = implode(',', array_fill(0, count($tableValues), '?'));
$tableColumns = '`' . implode('`,`', $rego_columns) . '`';

$query = 'INSERT INTO table_name (' . $tableColumns  . ') VALUES(' . $placeholders . ')';    

$stmt = $pdo->prepare($query);
$stmt->execute($tableValues);