我使用
PDOStatement::fetchAll()
与 FETCH_GROUP
和 FETCH_ASSOC
来获取表的主键作为数组键。
$objects = $stmt_obj->fetchAll(PDO::FETCH_GROUP | PDO::FETCH_CLASS);
这会导致以下结果:
Array
(
[56] => Array
(
[0] => stdClass Object
(
...
)
)
[39] => Array
(
[0] => stdClass Object
(
...
)
)
[38] => Array
(
[0] => stdClass Object
(
...
)
)
[71] => Array
(
[0] => stdClass Object
(
...
)
)
)
要删除我使用的无用编号数组的结果:
$objects = array_Map('reset', $objects);
如此处所述: https://www.php.net/manual/en/pdostatement.fetchall.php#88699 或在这里: https://gist.github.com/ Betweenbrain/9239337
在 PHP 8.2 中我收到警告:
PHP Warning: reset(): Argument #1 ($array) must be passed by reference, value given
我可以使用什么其他方法来摆脱无用的编号数组并获得以下对象的平面关联结果数组?:
Array
(
[56] => stdClass Object
(
...
)
[39] => stdClass Object
(
...
[38] => stdClass Object
(
...
)
[71] => stdClass Object
(
...
)
)
无需映射数组。添加
PDO::FETCH_UNIQUE
标志,结果将使每个元素作为单个对象,而不是对象数组。
$objects = $stmt_obj->fetchAll(PDO::FETCH_GROUP | PDO::FETCH_CLASS | PDO::FETCH_UNIQUE);
请参阅文档中的此示例。
当您将
reset
作为回调函数直接传递给 array_map
时,您将尝试在 reset
数组的每个元素上使用 $objects
。但是, reset
希望其参数通过引用传递,因为它可能通过将其内部指针重置为第一个元素来修改数组。因此,您可以使用内部带有 reset
的匿名函数(闭包)或不需要通过引用传递数组的 current
。
$objects = [
56 => [new stdClass()],
39 => [new stdClass()],
38 => [new stdClass()],
];
print_r($objects);
$new_array_using_reset = array_map(static fn (array $array) => reset($array), $objects);
print_r($new_array_using_reset);
$new_array_using_current = array_map('current', $objects);
print_r($new_array_using_current);
输出:
$objects
:
Array
(
[56] => Array
(
[0] => stdClass Object
(
)
)
[39] => Array
(
[0] => stdClass Object
(
)
)
[38] => Array
(
[0] => stdClass Object
(
)
)
)
$new_array
(使用 reset
或 current
:
Array
(
[56] => stdClass Object
(
)
[39] => stdClass Object
(
)
[38] => stdClass Object
(
)
)
注意来自 @YourCommonSense 的警告 有没有办法使用 PDO 获取按指定列的值分组的关联数组?。不要使用
FETCH_GROUP
,而是将其替换为 FETCH_UNIQUE
,这样您就不会被有效负载中过多的级别所困扰。
代码:(PHPize演示)
$stmt = $pdo->prepare($sql);
$stmt->execute();
var_export($stmt->fetchAll(PDO::FETCH_UNIQUE | PDO::FETCH_CLASS));