Экспорт многомерного массива объектов как CSV
У меня есть массив $csvRows
как следующее. Я хочу экспортировать этот массив как CSV.
Array
(
[0] => SingleModule Object
(
[module:SingleModule:private] => Module Object
(
[name:Module:private] => SimpleXMLElement Object
(
[0] => some string
)
[position:Module:private] => SimpleXMLElement Object
(
[0] => 1000
)
[config:Module:private] => SimpleXMLElement Object
(
)
)
[moduleMeta:SingleModule:private] => ModuleMeta Object
(
[description:ModuleMeta:private] => description text
[featureOrUseCase:ModuleMeta:private] => feature or usecase text
[inputParam:ModuleMeta:private] => input Parameter text
[changedParam:ModuleMeta:private] => changed Parameter text
[newOutputParam:ModuleMeta:private] => new Output Param text
[commentOrNote:ModuleMeta:private] => comments Or Note text
)
)
[1] => SingleModule Object
(etc...)
Я уже попробовал решение, которое я нашел в этой ссылке. Вот мой пример кода:
$fileName = "../../data/modules.csv";
$output = fopen($fileName, 'w+');
foreach ( $csvRows as $file ) {
$result = [ ];
array_walk_recursive($file, function ($item) use (&$result) {
$result [] = $item;
});
fputcsv($output, $result);
}
fclose($output);
Тогда я получаю следующую ошибку:
PHP Recoverable fatal error: Object of class Module could not be converted to string ...in line where fputcsv is.
Я временно решил проблему, вручную создав простой массив, подобный следующему, который я нашел в этой ссылке:
$csvRows = array(
array( 'row_1_col_1', 'row_1_col_2', 'row_1_col_3' ),
array( 'row_2_col_1', 'row_2_col_2', 'row_2_col_3' ),
array( 'row_3_col_1', 'row_3_col_2', 'row_3_col_3' ),
);
Но я хочу экспортировать мой фактический $csvRows
массив объектов как CSV. Я начинающий программист, поэтому любые предложения и помощь будут высоко оценены.
1 ответ
Попробуйте следующее решение:
$str = json_encode($csvRows);
$csvRows = json_decode($str, true);
foreach ($csvRows as $file) {
$result = [];
array_walk_recursive($file, function($item) use (&$result) {
$result[] = $item;
});
fputcsv($output, $result);
}
Просто конвертируйте все эти объекты в ассоциативный массив. А затем добавьте массив в CSV. использование JsonSerializable
интерфейс на SingleModule
Класс и настройте следующий метод:
class SingleModule implements JsonSerializable {
//YOUR CODE
public function jsonSerialize() {
return get_object_vars($this);
}
}