Префикс ключей массива со строкой (:) в PHP

Быстрый; Я знаю решение, но я ищу что-то более элегантное, если оно существует.

Я использую PDO для новых операторов:

$sql = "INSERT INTO my_table (foo, bar, baz) VALUES (:foo, :bar, :baz)"; $source->execute($sql, array( ':foo' => $foo, ':bar' => $bar, ':baz' => $baz, )); 

Это нормально, но я хочу передать ранее созданный массив, однако содержащиеся в нем ключи не префикс двоеточия (:), и я считаю, что должен быть элегантный способ:

 $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-лайнер; решает X в моей XY-проблеме. Реформированное решение:

 $format = ':%s'; $values = array_flip(array_map(function ($key) use($format) { return sprintf($format, $key); }, array_flip($values))); 

Обернутый функцией, возможно, array_keys_format(array $array, $format)

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

PDOStatement::execute() что вышеупомянутые вызовы PDOStatement::execute() под капотом, причем указанный array является аргументом. 1

🙂


1) Протестировано с версией 5.2.17 и 5.3.8 здесь и работает как ожидалось.

Это уже ответили, но это то, что я придумал.

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

используйте функцию map php: 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); 

Один лайнер…

 $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.