快一点;我知道一个解决方案,但如果它存在,我正在寻找更优雅的东西。
我正在使用PDO进行预先准备的陈述:
$sql = "INSERT INTO my_table (foo, bar, baz) VALUES (:foo, :bar, :baz)";
$source->execute($sql, array(
':foo' => $foo,
':bar' => $bar,
':baz' => $baz,
));
这很好,但我想传入一个先前创建的数组,但是包含的键没有以冒号(:
)作为前缀,我认为必须有一个优雅的方法:< / p>
$array = array(
'foo' => 'some',
'bar' => 'random',
'baz' => 'value',
);
并将其翻译成:
$array = array(
':foo' => 'some',
':bar' => 'random',
':baz' => 'value',
);
不做:
$temp = array();
foreach($array as $key => $value){
$temp[':' . $key] = $value;
}
$array = $temp;
我浏览过PHP文档,但找不到适合此目的的函数(或序列)。
有什么想法吗?
留下接受的答案,但+1 @chim为他聪明的1班轮;在我的XY问题中解决了X.重新格式化的解决方案:
$format = ':%s';
$values = array_flip(array_map(function ($key) use($format) {
return sprintf($format, $key);
}, array_flip($values)));
包含在一个函数中,可能是array_keys_format(array $array, $format)
答案 0 :(得分:8)
$source->execute($sql, array(
'foo' => $foo,
'bar' => $bar,
'baz' => $baz
));
这假设上面的调用是PDOStatement::execute()
,上面以array
为参数。 1
<强>:)强>
<小时/> 1)在此处使用版本
5.2.17
和5.3.8
进行测试,并按预期工作。
答案 1 :(得分:3)
它已经得到了解答,但无论如何这都是我提出来的。
$arr = array('foo'=>1,'bar'=>2);
$arr = array_flip($arr);
array_walk($arr,create_function('&$v,$k', '$v = ":$v";'));
$arr = array_flip($arr);
print_r($arr);
答案 2 :(得分:2)
使用php map-function:http://php.net/manual/en/function.array-map.php
function reduce($key)
{
if(strpos($key,":")===0)
return substr($key,1);
return $key;
}
$array = array_map("reduce",$array);
答案 3 :(得分:2)
一个班轮......
$array = array('test'=>'55','yest'=>'66');
$array = array_flip(array_map(function($v){return ':' . $v;},array_flip($array)));
// array(':test'=>'55',':yest'=>'66');
然而,这不安全,因为array_flip依赖于所有值都是唯一的。
因此,其中一个循环解决方案可能是最好的,或者array_keys也可以是array_combine。