在PHP中使用字符串(:)前缀数组键

时间:2011-10-01 08:14:09

标签: php arrays key

快一点;我知道一个解决方案,但如果它存在,我正在寻找更优雅的东西。

我正在使用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)

4 个答案:

答案 0 :(得分:8)

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

这假设上面的调用是PDOStatement::execute(),上面以array为参数。 1

<强>:)

<小时/> 1)在此处使用版本5.2.175.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。