【问题标题】:Export multidimensional array of objects as CSV将多维对象数组导出为 CSV
【发布时间】:2018-03-06 12:27:00
【问题描述】:

我有一个数组$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。我是一个新手程序员,所以任何建议和帮助将不胜感激。

【问题讨论】:

  • 嗨,我已经尝试过您的建议,如下所示:$str = json_encode($csvRows); $csvRows = json_decode($str, true); $fp = fopen("../../data/modules.csv", 'w+'); foreach ( $csvRows as $column ) { fputcsv($fp, $column); } fclose($fp); 但我只有一个空的 csv 文件。有什么想法吗?

标签: php csv multidimensional-array fputcsv


【解决方案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。在SingleModule类上使用JsonSerializable接口并配置如下方法:

class SingleModule implements JsonSerializable {
//YOUR CODE
    public function jsonSerialize() {
        return get_object_vars($this);
    }
}

【讨论】:

  • 嗨,我已经尝试过您的建议,如下所示:$str = json_encode($csvRows); $csvRows = json_decode($str, true); $output = fopen("../../data/modules.csv", 'w+'); foreach ( $csvRows as $file ) { $result = [ ]; array_walk_recursive($file, function ($item) use (&$result) { $result [] = $item; }); fputcsv($output, $result); } 但我只有一个空的 csv 文件。有什么想法吗?
  • @IqbalNazir 这可能是由于对象的每个属性都是private。你不能在课堂外访问它。
  • 是的,你是对的。当我将访问修饰符更改为public 时,它正在工作。感谢那。但我想让它们保密,并将它们导出为 CSV。有什么想法吗?
  • @IqbalNazir 看看ReflectionClass
  • @IqbalNazir 我在回答中为此提供了解决方案。