我有一个基本的订单系统,我用PHP构建。每个产品可以包含无限数量的元数据条目(包含该产品的信息)。我想构建一个CSV导出,它将每个元数据选项包含在导出文件中的一列中。导出应仅包含订单中产品的元数据。
例如,如果我有以下数组:
order = array(
'Product1' => array(
'name' => 'TShirt',
'MetaData' => array(
'1' => array(
'key' => 'size',
'value' => 'm'
)
),
'Product2' => array(
'name' => 'Backpack',
'MetaData' => array(
'1' => array(
'key' => 'waist',
'value' => '50 cm'
),
'2' => array(
'key' => 'height',
'value' => '150 cm'
)
'3' => array(
'key' => 'chest',
'value' => '25 cm'
)
),
)
我希望CSV看起来像:
(header row): product / size / waist / height / chest
(data row): t-shirt / m / NULL / NULL / NULL
(data row): backpack / NULL / 50 cm / 150 cm / 25 cm
我知道我可以硬编码,但我希望它可以扩展。我知道这需要分两步完成 - 1)通过迭代每个产品和每个产品的元数据来构建列,2)为每个产品添加一个行条目 - 但我不能确切地说明如何做到这一点。我正在运行的问题是知道我正在插入数据的列。任何帮助将不胜感激!
答案 0 :(得分:0)
这就是我想出的。希望它能给你一个起点。
<?php
// Your original array (I've made a few corrections)
$order = array(
'Product1' => array(
'name' => 'TShirt',
'MetaData' => array(
'1' => array(
'key' => 'size',
'value' => 'm'
)
)
),
'Product2' => array(
'name' => 'Backpack',
'MetaData' => array(
'1' => array(
'key' => 'waist',
'value' => '50 cm'
),
'2' => array(
'key' => 'height',
'value' => '150 cm'
),
'3' => array(
'key' => 'chest',
'value' => '25 cm'
)
)
),
);
// Declare header array to receive all keys from metadata
$header = array();
// Sweep metadata portion of array to retrieve keys
foreach ($order as $product) {
foreach ($product['MetaData'] as $metadata) {
if (! in_array($metadata['key'], $header)) {
$header[] = $metadata['key'];
}
}
}
// Declare content array
$content = array();
// Sweep array again to get the appropriate key/value matches
foreach ($order as $product) {
$row = array();
$row[] = $product['name'];
// Get metadata
foreach ($header as $heading) {
$added = false; // set a flag so if there are no matches, fill with "NULL" (below)
foreach ($product['MetaData'] as $metadata) {
if ($heading == $metadata['key']) { // if the heading matches the metadata key, we got a match
$row[] = $metadata['value'];
$added = true;
break;
}
}
if (! $added) {
$row[] = 'NULL';
}
}
// Add the row to the content array
$content[] = $row;
}
// Put it all together
$csv = 'product / ' . implode(' / ', $header) . "\n";
foreach ($content as $row) {
$csv .= implode(' / ', $row) . "\n";
}
echo "<pre>$csv</pre>";
?>
祝你好运!