Yii 的 findAll() 返回 ActiveRecord 對象數組,直接 print_r 顯示冗餘屬性。本文提供 actionIndex 示例,演示如何將 AR 對象數組轉為純數據數組,僅保留表字段值,便於 JSON 輸出或模板渲染。
<?php
public function actionIndex() {
// 1. 查詢數據
$data = Tableone::model()->findAll([
'limit' => 10,
]);
// 2. AR 對象轉純數組(僅適用 findAll 多維數組)
$return = array_map(function ($record) {
$schema = [];
$result = [];
// 獲取表結構列名
if (isset($record->tableSchema->columns)) {
foreach ($record->tableSchema->columns as $k => $v) {
$schema[] = $k;
}
}
// 僅提取表字段對應的屬性值
if (count($schema) > 0) {
foreach ($schema as $k => $v) {
$result[$v] = $record->attributes[$v];
}
}
return $result;
}, $data);
// 3. 輸出驗證
print_r($return);
}
?>
$record->tableSchema->columns:Yii AR 內置表結構元數據,鍵為字段名;$record->attributes:包含所有屬性(含關聯、虛擬屬性),需按 $schema 過濾;array_map:函數式風格處理每條記錄,代碼簡潔;findAll 返回的多維數組;find 單對象需先包裝為單元素數組再處理。若需在 CGridView 顯示原生 SQL 查詢結果,無需轉 AR:
<?php
// Controller
$rawData = Yii::app()->db->createCommand('SELECT * FROM {{post}} WHERE id < 100')->queryAll();
$dataProvider = new CArrayDataProvider($rawData, [
'id' => 'user',
'sort' => ['attributes' => ['id', 'title', 'content']],
'pagination' => ['pageSize' => 10],
]);
$this->render('gridview_array', ['dataProvider' => $dataProvider]);
?>
<!-- View -->
<?php $this->widget('zii.widgets.grid.CGridView', [
'id' => 'somegrid',
'dataProvider' => $dataProvider,
'columns' => ['id', 'title', 'content'],
]); ?>
$record->attributes 不包含未聲明的關聯,需 with() 預載入;findAll 全量載入,大表請用 CDbDataProvider + pagination 分頁;ActiveRecord::findAll() 返回數組,asArray() 可直接返回純數組,無需手動轉換。掌握 AR 轉數組技巧,能靈活應對 API 輸出、異步渲染、導出報表等場景。