Prefixing array keys with a string (:) in PHP

2019-02-22 06:43发布

问题:

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)

回答1:

$source->execute($sql, array(
    'foo' => $foo,
    'bar' => $bar,
    'baz' => $baz
));

This is presuming the above calls PDOStatement::execute() under the hood, with the above array as its argument.1

:)


1) Tested with version 5.2.17 and 5.3.8 here, and working as expected.



回答2:

It has already been answered but this is what I came up with anyway.

$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);


回答3:

use the 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);


回答4:

One liner...

$array = array('test'=>'55','yest'=>'66');

$array = array_flip(array_map(function($v){return ':' . $v;},array_flip($array)));

// array(':test'=>'55',':yest'=>'66');

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.



标签: php arrays key