2017-09-25 93 views
1

我有一个如下的数组$csvRows。我想将该数组导出为CSV。将对象的多维数组导出为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。我是一个新手程序员,所以任何建议和帮助将不胜感激。

+0

嗨,我想你的建议如下所示:'$海峡= json_encode($ csvRows); $ csvRows = json_decode($ str,true); $ fp = fopen(“../../ data/modules.csv”,'w +'); foreach($ csvRows as $ column){ fputcsv($ fp,$ column); } fclose($ fp);'但我只有一个空的csv文件。任何想法? – sumion

回答

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。使用上SingleModuleJsonSerializable接口,并配置以下方法:

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

嗨,我已经尝试过你的建议,如下所示:'$ 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文件。任何想法? – sumion

+0

@IqbalNazir它可能是由于对象的每个属性都是“私人”的。你不能在课堂外访问它。 – mega6382

+0

是的,你是对的。当我将访问修改器改为'public'时,它正在工作。感谢那。但我想保留它们的私密性,并将它们导出为CSV。任何想法? – sumion