如何将对象转换为数组并剔除默认值-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);

输出结果:

夏夕资源网专注于CMS网站模板,主流语言整站网站源码下载,网站建设相关教程分享,好用的软件素材整合下载,提供一站式便捷自助服务。
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需!
7. 如遇到加密压缩包,默认解压密码为"zy.lucklyus.top",如遇到无法解压的请联系管理员!
夏夕资源网-网站模板_免费源码_资源素材 » 如何将对象转换为数组并剔除默认值-php教程
在线时间:12:00 - 22:00
关注微信公众号:微信公众号
站长邮箱:[email protected]
  • 运营天数: 1392+
  • 资源总数: 47989+
  • 用户总数: 1+
  • 今日更新: 0+
  • 访问次数: 4003117+
  • 本周更新: 0+
  • 最后更新: 2026-03-16

本站指数

×
  • 运营天数: 1392+
  • 资源总数: 47989+
  • 用户总数: 1+
  • 今日更新: 0+
  • 访问次数: 4003117+
  • 本周更新: 0+
  • 最后更新: 2026-03-16