在處理 API 回傳、配置檔、ORM 實體時,陣列與物件互轉是高頻需求。本文整理三種遞歸實現,涵蓋多維巢狀結構、資源型別防護、效能差異。
<?php
function arrayToObject($e) {
if(gettype($e) != 'array') return;
foreach($e as $k => $v) {
if(gettype($v) == 'array' || gettype($v) == 'object') {
$e[$k] = (object)arrayToObject($v);
}
}
return (object)$e;
}
?>
<?php
function objectToArray($e) {
$e = (array)$e;
foreach($e as $k => $v) {
if(gettype($v) == 'resource') return; // 防護資源型別
if(gettype($v) == 'object' || gettype($v) == 'array') {
$e[$k] = (array)objectToArray($v);
}
}
return $e;
}
?>
<?php
function object_to_array($e) {
$_arr = is_object($e) ? get_object_vars($e) : $e;
foreach($_arr as $key => $val) {
$val = (is_array($val) || is_object($val)) ? object_to_array($val) : $val;
$arr[$key] = $val;
}
return $arr;
}
?>
| 方法 | 優點 | 缺點 | 適用場景 |
|---|---|---|---|
| arrayToObject | 邏輯直觀 | 未處理非陣列輸入、資源型別 | 純陣列轉物件 |
| objectToArray | 處理 resource 型別防護 | 強制 (array) 轉型可能包含不可見屬性 | 一般物件轉陣列 |
| object_to_array | 使用 get_object_vars 只取可見屬性,支援陣列直接傳入 | 略繁瑣 | 通用性最強,推薦生產環境 |
get_object_vars() 僅返回當前作用域可見屬性,若在類外呼叫無法取得 private 屬性。spl_object_id() 追蹤已處理物件。