我有以下数组:
$names = [
['Joe','Moe','Joey'],
['John','Doe','Curly'],
['Jimmy','Fallon','Funny']
];
我要做的,是内爆成一个字符串,看起来像这样:
"('Joe','Moe','Joey'),('John','Doe','Curly'),('Jimmy','Fallon','Funny')"
内爆函数不能在数组的数组上工作,所以我做了以下操作,它完成了我需要的:
$strings = [];
foreach ($names as $name) {
$strings[] = '('.implode(',',$name).')';
}
$output = implode(',',$strings);
我的问题是:有没有更干净的方法来做这件事?
如果您打算在SQL查询中使用数组,那么您就错了。而不是…
- 准备声明
- 迭代数组并绑定变量
- 执行该语句 例如
// PDO version
$stmt = $conn->prepare("INSERT INTO tableName VALUES (?, ?, ?)");
foreach ($names as $row) {
$stmt->execute($row);
}
// MySQLi version because for some reason people keep using it
$stmt = $conn->prepare("INSERT INTO tableName VALUES (?, ?, ?)");
$stmt->bind_param("sss", $a, $b, $c);
foreach ($names as [ $a, $b, $c ]) {
$stmt->execute();
}
原答案
implode()
和array_map()
的组合应该可以工作
$output = implode(",", array_map(function($row) {
return sprintf("(%s)", implode(",", array_map(function($name) {
return "'$name'";
}, $row)));
}, $names));
这包括单引号是每个名称和包装每组括号。
Demo ~ https://3v4l.org/PLu1g
当您在foreach循环中修改数据时,这是一种代码气味。通常你可以用减速器,映射或类似的东西来代替。这使得你的代码更容易理解
$result = array_map( function($item) {
return "('" . implode( "','", $item) . "')";
}, $names );
$result = '"'.implode( ',', $result ).'"';
如果重复使用此代码,请将其放入返回该字符串的函数或方法中。