Quick one; I know a solution, but I'm looking for something more elegant if it exists.
I'm using PDO for prepeared statements:
$sql = "INSERT INTO my_table (foo, bar, baz) VALUES (:foo, :bar, :baz)";
$source->execute($sql, array(
':foo' => $foo,
':bar' => $bar,
':baz' => $baz,
));
This is fine, but I want to pass in a previously created array, however the keys contained aren't prefixed by the colon (:
), and I figure there must be an elegant way to take:
$array = array(
'foo' => 'some',
'bar' => 'random',
'baz' => 'value',
);
And translate it into:
$array = array(
':foo' => 'some',
':bar' => 'random',
':baz' => 'value',
);
Without doing:
$temp = array();
foreach($array as $key => $value){
$temp[':' . $key] = $value;
}
$array = $temp;
I've browsed the PHP docs, but I can't find a function (or sequence of) that suits the purpose.
Any ideas?
Addendum
Leaving the accepted answer, but +1 @chim for his clever 1-liner; solves the X in my XY problem. Reformatted solution:
$format = ':%s';
$values = array_flip(array_map(function ($key) use($format) {
return sprintf($format, $key);
}, array_flip($values)));
Wrapped in a function, perhaps array_keys_format(array $array, $format)
It has already been answered but this is what I came up with anyway.
One liner...
However this isn't safe as array_flip relies on all values being unique.
So one of the looping solutions is probably the best, or alternatively array_keys with array_combine.
This is presuming the above calls
PDOStatement::execute()
under the hood, with the abovearray
as its argument.1:)
1) Tested with version
5.2.17
and5.3.8
here, and working as expected.use the php map-function: http://php.net/manual/en/function.array-map.php