Быстрый; Я знаю решение, но я ищу что-то более элегантное, если оно существует.
Я использую 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.