Экспорт многомерного массива объектов как 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);
    }
}
Другие вопросы по тегам