我将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作为回调函数直接传递给array_map时,你试图在$objects数组的每个元素上使用reset.但是,reset期望通过引用传递其参数,因为它可能通过将其内部指针重置为第一个元素来修改array.所以你可以使用匿名函数(闭包),里面有reset或者current,它不需要通过引用传递array.

$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(使用resetcurrent:

Array
(
    [56] => stdClass Object
        (
        )

    [39] => stdClass Object
        (
        )

    [38] => stdClass Object
        (
        )

)

Php相关问答推荐

如何使用属性#[Embedded]嵌入带有规则的对象集合?

Laravel迁移返回SQL错误,但SQL有效且工作正常

如何在不指定symfony列的情况下从数据库中获取行数组

通过注册在Laravel中分配角色

创建一个新的可变产品及其属性以用于WooCommerce中的变体

用于计算付款费用的WooCommerce管理编辑产品中的自定义复选框

Sylius php -如何将购物车传递到小枝模板(Sylius模板事件)

WHERE方法不能与有效查询Laravel一起使用

将下拉 Select 的值从WooCommerce后端保存并显示到前端

无法在Laravel中将日志(log)通道设置为空

shell_exec运行大型数据处理

重命名 WordPress 中现有的自定义分类法名称和标签

WooCommerce 相关产品(按 children 类别)作为排名数学主要类别的后备

正则表达式将文本替换为标签 html 以字符开头

如何搜索和替换 XML 文件中的一段文本?

Windows 身份验证在 IIS 中验证什么?我可以在我的情况下禁用匿名身份验证吗?

来自 GoDaddy 的邮箱在 Gmail 中显示为via

如何通过额外的属性和本地化来使用 laravel 枚举

列表不在 GROUP BY 子句中并且包含 X2CRM 中的非聚合列

用于多态服务的 Symfony setter 注入