使用MetaData进行PHP CSV导出

时间:2014-05-29 18:59:11

标签: php csv

我有一个基本的订单系统,我用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)为每个产品添加一个行条目 - 但我不能确切地说明如何做到这一点。我正在运行的问题是知道我正在插入数据的列。任何帮助将不胜感激!

1 个答案:

答案 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>";

?>
祝你好运!