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