如何使用 PDO::FETCH_GROUP 获取平面数组? [重复]

问题描述 投票: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
                (
                    ...
                )
        )
)

我该怎么做才能摆脱无用的编号数组并得到以下结果:

Array
(
    [56] => stdClass Object
        (
            ...
        )

    [39] => stdClass Object
        (
            ...

    [38] => stdClass Object
        (
            ...
        )

    [71] => stdClass Object
        (
            ...
        )
)
php pdo
3个回答
1
投票

无需映射数组。添加

PDO::FETCH_UNIQUE
标志,结果将使每个元素作为单个对象,而不是对象数组。

$objects = $stmt_obj->fetchAll(PDO::FETCH_GROUP | PDO::FETCH_CLASS | PDO::FETCH_UNIQUE);

请参阅文档中的此示例


1
投票

注意来自 @YourCommonSense 的警告 有没有办法使用 PDO 获取按指定列的值分组的关联数组?。不要使用

FETCH_GROUP
,而是将其替换为
FETCH_UNIQUE
,这样您就不会被有效负载中过多的级别所困扰。

代码:(PHPize演示

$stmt = $pdo->prepare($sql);
$stmt->execute();
var_export($stmt->fetchAll(PDO::FETCH_UNIQUE | PDO::FETCH_CLASS));

0
投票

当您将

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

)
© www.soinside.com 2019 - 2024. All rights reserved.