在fetchAll page上有一条关于php.org的评论。
您可能会发现自己想要使用
FETCH_GROUP
和FETCH_ASSOC
同时,将表的主键作为数组键:
// $stmt is some query like "SELECT rowid, username, comment"
$results = $stmt->fetchAll(PDO::FETCH_GROUP|PDO::FETCH_ASSOC);
// It does work, but not as you might expect:
$results = array(
1234 => array(0 => array('username' => 'abc', 'comment' => '[...]')),
1235 => array(0 => array('username' => 'def', 'comment' => '[...]')), );
但你至少可以轻松剥离无用的编号数组:
$results = array_map('reset', $results);
代码按预期运行,所有内容都只用line:
完成array_map('reset', $results);
在阅读文档array_map和reset函数后,我真的不明白当两者合并为一行时如何产生结果。
这是一个安全的解决方案吗?你会推荐这种单行还是副作用,不应该使用,即我应该写一个普通的旧循环来产生相同的结果吗?
结合两个标准功能的单线解决方案对我来说是非常有吸引力的解决方案。我只是想确保没有意外。
答案 0 :(得分:3)
这里的诀窍是reset
在这种情况下是相等的(建议我们在array_map
中迭代$结果)到$results[$i][0]
。除了内部指针重绕之外,reset
返回传递数组的第一个元素,就像那样简单。
作为附注,我建议PDO::FETCH_CLASS
实施ArrayAccess Interface来实现此行为。
答案 1 :(得分:-1)
是的,这是安全的。 array_map()
用回调函数的结果替换数组成员,reset()
返回数组的第一个成员。
所以,
array(0 => array('username' => 'abc', 'comment' => '[...]'))
替换为
array('username' => 'abc', 'comment' => '[...]')
因为reset()
从前一行返回这一行。
因此,真正的单行将是我的safe and convenient database access library's getInd
家庭功能(允许任何字段作为键,而不是主索引):
$data = $db->getInd("id", "SELECT * FROM table WHERE category=?i", $cat);
$dic = $db->getIndCol("name", "SELECT name, id FROM cities");
你可能会注意到这些是真正的单行,在里面做所有脏的和重复的工作,包括查询执行,参数绑定和东西。