PHP 如何通过reset()使用array_map

问题描述 投票:0回答:3

我使用 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
        (
            ...
        )
)
php pdo array-map
3个回答
0
投票

不要使用

reset()
,它的目的是对变量产生副作用,而使用仅返回数组第一个元素的函数。

$objects = array_map(function($row) => $row[0], $objects);

0
投票

当您将

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
        (
        )

)

0
投票

以这种方式使用 reset() 是不正确的并且 您引用的示例非常古老,同时一些“通知”错误(幸运的是)已变成“警告”。 更当前的方法可能是将 spread 运算符array_merge():

一起使用
$objects = array_merge(...$objects);
© www.soinside.com 2019 - 2024. All rights reserved.