ArrayHelper::toArray() 的 $properties 参数用于精确控制对象转数组的字段选择、重命名、关联对象递归展开及动态计算字段;支持类名映射、字符串键重命名、匿名函数计算值,并配合 $recursive 参数灵活控制递归深度。

指定基础字段和重命名
最常用的是用数组定义「类名 → 字段列表」,字段名直接对应属性,字符串键可实现重命名:
-
直接取属性:写
'id'、'title'就取对象自身的同名 public 属性或 getter 方法返回值 -
重命名字段:用
'createTime' => 'created_at',表示结果数组中键为createTime,值来自对象的created_at属性
处理关联对象(嵌套 toArray)
如果对象有关联(比如 Post 模型有 $author 属性指向 User 对象),你可以在 `$properties` 中为关联类也定义规则,它会自动递归调用 toArray():
- 例如:
'app\models\User' => ['id', 'name', 'email'],当 Post 的$author是 User 实例时,就会按这个规则转成子数组 - 注意:必须显式声明关联类的规则,否则默认只保留对象 ID 或 toString 结果,不会展开
用回调函数做动态计算
字段值不一定是静态属性,可用匿名函数实时计算:
- 比如:
'length' => function($post) { return strlen($post->content); },结果数组里会出现'length' => 301 - 回调接收当前对象作为参数,可访问任意属性、方法、甚至关联对象,适合生成摘要、状态标签、URL 等衍生字段
控制递归深度与开关
第三个参数 $recursive 默认为 true,但配合 $properties 可精细控制:
- 设为
false时,即使写了关联类规则也不会展开,只转当前层 - 若只想展开某一层关联(如 Post → Author),但不继续展开 Author → Profile,就不要给 Profile 类写规则,同时保持
$recursive = true即可


















