我使用 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
(
...
)
)
不要使用
reset()
,它的目的是对变量产生副作用,而使用仅返回数组第一个元素的函数。
$objects = array_map(function($row) => $row[0], $objects);
当您将
reset
作为回调函数直接传递给 array_map
时,您正在尝试对 $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
(
)
)
以这种方式使用 reset() 是不正确的并且 您引用的示例非常古老,同时一些“通知”错误(幸运的是)已变成“警告”。 更当前的方法可能是将 spread 运算符 与 array_merge():
一起使用$objects = array_merge(...$objects);