将多维对象数组导出为CSV

时间:2017-09-25 13:48:23

标签: php csv multidimensional-array fputcsv

我有一个数组$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...)

我已经尝试过在this link中找到的解决方案。这是我的代码示例:

$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.

我已经通过手动创建一个如下所示的简单数组暂时解决了这个问题,我在this link中找到了:

 $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 个答案:

答案 0 :(得分: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);
    }
}