从 CSV 创建嵌套 objects

Create nested objects from CSV

我有一个 CSV 文件需要处理成 objects。

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

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

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

如果事先不知道 headers 会是什么,我将如何动态处理?

基本上我想把一个字符串,比如 "Prop.Prop.Prop.etc" 变成一个嵌套的 object。

$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;
  }
}

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

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

在你的例子中详细说明:

<?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>';

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