1

在fetchAll page上有一条关于 php.org 的评论。

您可能会发现自己想要同时使用FETCH_GROUPFETCH_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);

代码按预期运行,一切都只需一行即可完成:

array_map('reset', $results);

阅读文档 array_map 和 reset 函数后,我真的不明白当两者组合在一行中时结果是如何产生的。

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

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

4

2 回答 2

3

这里的技巧是reset在这种情况下等于(建议我们通过 $results in 迭代array_map)到 a $results[$i][0]reset,除了内部指针倒带,返回传递数组的第一个元素,就这么简单。

作为旁注,我建议通过PDO::FETCH_CLASS实现ArrayAccess Interface来实现此行为。

于 2013-01-24T05:21:41.643 回答
-1

是的,它是安全的。array_map()用回调函数的结果替换数组成员并reset()返回数组的第一个成员。
所以,

array(0 => array('username' => 'abc', 'comment' => '[...]'))

被替换为

array('username' => 'abc', 'comment' => '[...]')

asreset()从前一条中返回这条线。

但老实说,这对我来说是一种从未存在过的问题。
我不明白仅使用 API 函数制作单行代码的想法有什么吸引力,产生任何令人难以置信的声明以遵守一条规则 - “不惜一切代价没有用户定义的函数”。
我可以制作自己的任何功能,并且在调用时它会比这些代码扭曲中的任何一个都短,但在 body 中具有简单易读的语法,在写作和阅读时都不会摸不着头脑,也不会问自己一个问题“是吗?安全的?”。

所以,一个真正的单行将是我安全方便的数据库访问库的 getInd系列函数(它允许任何字段作为键,而不仅仅是主索引):

$data = $db->getInd("id", "SELECT * FROM table WHERE category=?i", $cat);
$dic  = $db->getIndCol("name", "SELECT name, id FROM cities");

你可能会注意到这些是真正的单行代码,在内部完成所有肮脏和重复的工作,包括查询执行、参数绑定和其他东西。

于 2013-01-24T05:19:00.057 回答