从CSV创建嵌套对象

时间:2015-02-03 23:47:16

标签: php csv

我有一个需要处理成对象的CSV文件。

我可以打开CSV文件并获取我想要的所有内容,没问题。我需要通过标题将CSV文件的内容与对象匹配。例如:

Name | Address.Street | Address.Country | Notes.Example.Value

Object->Name
Object->Address
Object->Notes
etc.

我如何动态处理这个问题,而不知道事先要知道什么是标题?

基本上我想转一个字符串,比如" Prop.Prop.Prop.etc"嵌入对象。

$headers = array(); // First row of CSV.
$row = array(); // Current row of CSV.
$record = new StdClass();
foreach ($row as $key => $value) {
  $properties = explode('.', $headers[$key]);
  if (count($properties > 1)) {
    // ???
  }
  else {
    $record->{$properties[0]} = $value;
  }
}

1 个答案:

答案 0 :(得分:2)

这应该通过递归来完成。如果要解析的属性只有一个深度级别,则将对象键设置为值。 (你已经在做了)

如果它有两个或更多级别,则移动属性数组的第一个元素并递归剩余的级别。

在你的例子中阐述:

<?php 

$headers=[
        'Name',
        'Email',
        'Address.Street',
        'Address.Country',
        'Notes.Example.Value'
    ];

$row=[
        'john',
        'john@gmail.com',
        'beale street',
        'US',
        '180'
    ];


function setObject(&$object, $properties, $value) {

    $name=array_shift($properties);

    if(count($properties)===0) {
        return $object->{$name} = $value;
    } else {
        // if this property isn't set, we declare it as a new object
        if(!isset($object->{$name}) || !is_object($object->{$name})) $object->{$name} = new StdClass();
        return setObject($object->{$name}, $properties,$value);
    }
}


$record = new StdClass();

foreach($row as $key=>$value) {
    $properties = explode('.', $headers[$key]);
    setObject($record, $properties, $value);
}

echo '<pre>';
print_r($record);
echo '</pre>';

这可能不是最优雅的解决方案。通过一些工作,您可以避免来回传递对象。