PHP CSV Export With MetaData -
i have basic order system i've built in php. each product can have unlimited number of metadata entries (containing information product). want build csv export include each metadata option column in export file. export should contain metadata products in order.
for example, if have following array:
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' ) ), )
i csv like:
(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
i know can hardcode this, want scalable. know need done in 2 steps - 1) build columns iterating through each product , each product's meta, 2) add row entry each product - can't nail down how it. problem i'm running in knowing column i'm inserting data into. appreciated!
here's came with. hope gives starting point.
<?php // original array (i've made 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 receive keys metadata $header = array(); // sweep metadata portion of array retrieve keys foreach ($order $product) { foreach ($product['metadata'] $metadata) { if (! in_array($metadata['key'], $header)) { $header[] = $metadata['key']; } } } // declare content array $content = array(); // sweep array again appropriate key/value matches foreach ($order $product) { $row = array(); $row[] = $product['name']; // metadata foreach ($header $heading) { $added = false; // set flag if there no matches, fill "null" (below) foreach ($product['metadata'] $metadata) { if ($heading == $metadata['key']) { // if heading matches metadata key, got match $row[] = $metadata['value']; $added = true; break; } } if (! $added) { $row[] = 'null'; } } // add row content array $content[] = $row; } // put $csv = 'product / ' . implode(' / ', $header) . "\n"; foreach ($content $row) { $csv .= implode(' / ', $row) . "\n"; } echo "<pre>$csv</pre>"; ?>
good luck!
Comments
Post a Comment