PHP PDOStatement :: fetchAll和按键分组

时间:2013-01-24 04:40:36

标签: php pdo

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函数后,我真的不明白当两者合并为一行时如何产生结果。

这是一个安全的解决方案吗?你会推荐这种单行还是副作用,不应该使用,即我应该写一个普通的旧循环来产生相同的结果吗?

结合两个标准功能的单线解决方案对我来说是非常有吸引力的解决方案。我只是想确保没有意外。

2 个答案:

答案 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()从前一行返回这一行。

但老实说,这是一个从未存在过的问题 我不明白在使用API​​函数制作单行的想法中有什么吸引力,产生任何令人心碎的陈述以遵守一条规则 - “不需要任何代价的用户定义函数”。
我可以创建自己的任何函数,并且在调用时它将比任何这些代码扭曲短,但在正文中具有简单易读的语法,而不会让你头疼在写作和阅读时都没有问自己一个问题“它是否安全?”。

因此,真正的单行将是我的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");

你可能会注意到这些是真正的单行,在里面做所有脏的和重复的工作,包括查询执行,参数绑定和东西。