0

0

如何将对象转换为数组并剔除默认值

心靈之曲

心靈之曲

发布时间:2026-02-06 18:54:33

|

422人浏览过

|

来源于php中文网

原创

如何将对象转换为数组并剔除默认值

本文介绍一种可靠方法,将 php 对象实例转换为关联数组,并自动过滤掉所有与类定义中初始值相同的属性(即“默认值”),仅保留被显式修改过的字段,适用于数据库存储前的数据精简。

在 PHP 中,直接使用 (array) 强制类型转换虽能将对象转为数组,但存在明显局限:它会保留所有属性(包括未赋值的 null、空数组或字符串默认值),且无法区分“用户显式设置”与“继承自类定义的默认值”。更关键的是,当属性值为数组或对象时,array_diff() 会因不支持递归比较而抛出 Array to string conversion 错误。

理想的解决方案是显式获取类的默认状态快照,并与当前实例逐属性比对。以下是一个健壮、可复用的实现方式:

✅ 推荐实现(基于反射 + 属性比对)

class MyObject {
    public $title = null;
    public $description = null;
    public $items = [];
    public $metas = [];
    public $image = null;
    public $country = 'Belgium';
    // 注意:$children 不在原始类定义中,但运行时被动态添加 → 需保留!

    /**
     * 获取当前实例所有 public 属性的默认初始值(静态快照)
     */
    public function getDefaultValues(): array {
        $reflect = new ReflectionClass($this);
        $props = $reflect->getProperties(ReflectionProperty::IS_PUBLIC);

        $defaults = [];
        foreach ($props as $prop) {
            $name = $prop->getName();
            // 使用 ReflectionProperty::getDefaultValue() 更准确(PHP 8.0+)
            // 此处兼容旧版:通过新实例获取初始值
            $defaults[$name] = $prop->getDefaultValue() ?? null;
        }
        return $defaults;
    }

    /**
     * 获取当前实例中「非默认值」的属性,返回精简数组
     */
    public function toArrayWithoutDefaults(): array {
        $defaults = $this->getDefaultValues();
        $current = [];

        // 手动收集当前所有 public 属性(含动态添加项)
        foreach (get_object_vars($this) as $key => $value) {
            $current[$key] = $value;
        }

        $result = [];
        foreach ($current as $key => $value) {
            // 判断是否为默认值(支持 null、[]、字符串等基础类型)
            $isDefault = array_key_exists($key, $defaults)
                ? $this->deepEqual($value, $defaults[$key])
                : false;

            if (!$isDefault) {
                $result[$key] = $value;
            }
        }
        return $result;
    }

    /**
     * 深度比较两个值(简化版,支持 null、标量、数组)
     */
    private function deepEqual($a, $b): bool {
        if (is_array($a) && is_array($b)) {
            return $a === $b; // PHP 数组全等已支持深度比较
        }
        return $a === $b;
    }
}

? 使用示例

$data = new MyObject();
$data->title = 'NEW ITEM';
$data->children = ['CHILD1', 'CHILD2']; // 动态属性,不在类定义中 → 自动保留
$data->image = 'image.gif';
$data->country = 'Belgium'; // 与默认值相同 → 被剔除

$dataToStore = $data->toArrayWithoutDefaults();
print_r($dataToStore);

输出结果:

10Web
10Web

AI驱动的WordPress网站自动构建器,托管和页面速度助推器

下载
Array
(
    [title] => NEW ITEM
    [children] => Array
        (
            [0] => CHILD1
            [1] => CHILD2
        )
    [image] => image.gif
)

⚠️ 注意事项

  • 动态属性支持:get_object_vars() 可捕获运行时新增的 public 属性(如 $data->children),而 ReflectionClass::getProperties() 仅返回类定义中的属性。因此本方案兼顾灵活性与准确性。
  • 类型安全比对:使用 ===(全等)而非 ==,避免 '0' == 0 类型隐式转换导致误判。
  • 性能考量:反射操作有轻微开销,若高频调用,可将 getDefaultValues() 结果缓存于静态属性。
  • 扩展建议:如需支持 private/protected 属性,需配合 setAccessible(true);若需 JSON 序列化兼容,可实现 JsonSerializable 接口。

该方法逻辑清晰、无副作用、兼容主流 PHP 版本(7.4+),是生产环境中安全可靠的“默认值剥离”实践方案。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

429

2023.08.07

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

541

2023.08.23

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

313

2023.10.13

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

78

2025.09.10

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

605

2023.08.02

c语言中null和NULL的区别
c语言中null和NULL的区别

c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

240

2023.09.22

java中null的用法
java中null的用法

在Java中,null表示一个引用类型的变量不指向任何对象。可以将null赋值给任何引用类型的变量,包括类、接口、数组、字符串等。想了解更多null的相关内容,可以阅读本专题下面的文章。

600

2024.03.01

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

402

2023.08.03

Golang处理数据库错误教程合集
Golang处理数据库错误教程合集

本专题整合了Golang数据库错误处理方法、技巧、管理策略相关内容,阅读专题下面的文章了解更多详细内容。

0

2026.02.06

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PHP课程
PHP课程

共137课时 | 11.1万人学习

JavaScript ES5基础线上课程教学
JavaScript ES5基础线上课程教学

共6课时 | 11.2万人学习

PHP新手语法线上课程教学
PHP新手语法线上课程教学

共13课时 | 0.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号