在PHP中,给数组键名加上一个字符串前缀(:)

6

简单来说,我知道一种解决方案,但如果有更好的解决方案,我想采用更优雅的方法。

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

And translate it into:

$array = array(
    ':foo' => 'some',
    ':bar' => 'random',
    ':baz' => 'value',
);

不使用:

$temp = array();
foreach($array as $key => $value){
    $temp[':' . $key] = $value;
}
$array = $temp;

我已经浏览了PHP文档,但是找不到适合这个目的的函数(或者一系列函数)。
有任何想法吗?
补充说明:保留接受的答案,但+1 @chim的巧妙方法;解决了我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)


5
据我所知,PDO的execute()即使键没有加冒号前缀也能正确工作。 - NullUserException
2
请查看此链接:https://dev59.com/OnE85IYBdhLWcg3wzWzM - Mithun Satheesh
@NullUserException - 我也是这么想的,但它返回了无效的SQL状态,抱怨查询参数(除了冒号前缀,如果不需要的话,它会运行)。 - Dan Lugg
@Bracketworks:你使用的是哪个PHP版本?我在这里测试了5.2.175.3.8,并且按预期工作。 - Decent Dabbler
1
@fireeyedboy - 是的,睡眠不足并不等于工作。5.3.6,而且它正在运行 :) 抱歉NullUser,你也是正确的。 - Dan Lugg
4个回答

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

这里的假设是在执行PDOStatement::execute()时,使用上面提到的array作为其参数。1

:)


1) 在这里测试了版本5.2.175.3.8,并且按预期工作。


你知道吗,也许现在有点晚了,但它现在可以工作了。我要去睡觉了,但首先我会接受这个答案,因为它解决了问题,就像NullUser所说的一样。+1给大家。谢谢@fireeyedboy! - Dan Lugg

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

array_map不起作用,它不会影响数组的键,而上面的reduce函数也不会在任何东西的开头添加冒号(:)。 - chim
该函数的作用是从数组中的值中删除前导冒号。 - chim

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。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接