我有一个需要处理成对象的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;
}
}
答案 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>';
这可能不是最优雅的解决方案。通过一些工作,您可以避免来回传递对象。