Hon*_*ong 24 php arrays pdo fetch
例如,让我们使用一些简单的数据集
+---------+------+------+------------+
| name | age | sex | position |
+---------+------+------+------------+
| Antony | 34 | M | programmer |
| Sally | 30 | F | manager |
| Matthew | 28 | M | designer |
+---------+------+------+------------+
Run Code Online (Sandbox Code Playgroud)
我们想要得到的是以这种方式组织阵列
Array
(
[Antony] => Array
(
[age] => 34
[sex] => M
[position] => programmer
)
[Sally] => Array
(
[age] => 30
[sex] => F
[position] => manager
)
[Matthew] => Array
(
[age] => 28
[sex] => M
[position] => designer
)
)
Run Code Online (Sandbox Code Playgroud)
作为粗略的近似,我们可以使用
$pdo->query('SELECT * FROM employee')->fetchAll(PDO::FETCH_GROUP|PDO::FETCH_ASSOC);
Run Code Online (Sandbox Code Playgroud)
但结果我们有不必要的嵌套级别
Array
(
[Antony] => Array
(
[0] => Array
(
[age] => 34
[sex] => M
[position] => programmer
)
)
[Sally] => Array
(
[0] => Array
(
[age] => 30
[sex] => F
[position] => manager
)
)
[Matthew] => Array
(
[0] => Array
(
[age] => 28
[sex] => M
[position] => designer
)
)
)
Run Code Online (Sandbox Code Playgroud)
我试图通过使用回调函数摆脱这种不必要的嵌套级别
$stmt->fetchAll(PDO::FETCH_GROUP|PDO::FETCH_ASSOC|PDO::FETCH_FUNC, 'current');
Run Code Online (Sandbox Code Playgroud)
但由于某些原因它没有通过
Array
(
[0] => Array
(
[age] => 34
[sex] => M
[position] => programmer
)
)
Run Code Online (Sandbox Code Playgroud)
但只是一堆标量34, 'M', 'programmer'回调功能:(
您可以使用回调等功能查看它
function what_do_you_pass_me() {
$numargs = func_num_args();
$arg_list = func_get_args();
for ($i = 0; $i < $numargs; $i++) {
echo "Argument $i is: " . $arg_list[$i] . "\n";
};
echo "\n\n";
};
Run Code Online (Sandbox Code Playgroud)
那么有没有一种方法可以在PDO::FETCH_*不使用array_map('current', $result)获取结果后使用模式获得所需的结果集?
imc*_*iac 55
这是一个很老的话题,但我找到了非常简单的解决方案:
->fetchAll(\PDO::FETCH_GROUP|\PDO::FETCH_UNIQUE)
Run Code Online (Sandbox Code Playgroud)
第一个col将被设置为key,rest将被设置为value.
无需遍历数组或使用array_map.
小智 13
减少不必要的嵌套数组级别:
$res = $pdo->query('SELECT * FROM employee')->fetchAll(PDO::FETCH_GROUP|PDO::FETCH_ASSOC);
$res = array_map('reset', $res);
Run Code Online (Sandbox Code Playgroud)
小智 11
键关联数组
PDO::FETCH_GROUP|PDO::FETCH_UNIQUE|PDO::FETCH_ASSOC
Run Code Online (Sandbox Code Playgroud)
You*_*nse 10
接受的答案基本上是一个货物崇拜代码,它只是偶然地完成它的工作,但它本身没有任何意义.
PDO::FETCH_GROUP并且PDO::FETCH_UNIQUE是互斥的获取模式,不能一起使用.只有其中一个可以工作.当你将它们组合起来时,后者接管并且\PDO::FETCH_GROUP|\PDO::FETCH_UNIQUE实际上只是PDO::FETCH_UNIQUE.
除此之外,问题本身是模糊的,OP希望他的数组被唯一字段索引,而他称之为分组,这也引起了答案中的争议.
所以说实话:
对指数具有唯一值的数组(当你想要得到的阵列由雇员的姓名进行索引,因为它们是唯一的),在提取模式必须是 PDO :: FETCH_UNIQUE:
$pdo->query('SELECT * FROM employee')->fetchAll(PDO::FETCH_UNIQUE);
Run Code Online (Sandbox Code Playgroud)要对结果进行分组(例如,当您希望按部门对员工进行分组时),获取模式必须为 PDO :: FETCH_GROUP:
$pdo->query('SELECT * FROM employee')->fetchAll(PDO::FETCH_GROUP);
Run Code Online (Sandbox Code Playgroud)在这两种情况下,必须首先在SELECT字段列表中列出要用作第一级数组索引的字段.
关于的一个注释PDO::FETCH_ASSOC.鉴于首选结果格式的获取模式可以在构造函数中为所有结果设置一次,因此将其明确列出也没有意义.
| 归档时间: |
|
| 查看次数: |
24264 次 |
| 最近记录: |