Skip to content

Instantly share code, notes, and snippets.

@robflaherty
Created September 1, 2011 02:26
Show Gist options
  • Select an option

  • Save robflaherty/1185299 to your computer and use it in GitHub Desktop.

Select an option

Save robflaherty/1185299 to your computer and use it in GitHub Desktop.
Convert CSV to JSON
<?php
/*
* Converts CSV to JSON
* Example uses Google Spreadsheet CSV feed
* csvToArray function I think I found on php.net
*/
header('Content-type: application/json');
// Set your CSV feed
$feed = 'https://docs.google.com/spreadsheet/pub?hl=en_US&hl=en_US&key=0Akse3y5kCOR8dEh6cWRYWDVlWmN0TEdfRkZ3dkkzdGc&single=true&gid=0&output=csv';
// Arrays we'll use later
$keys = array();
$newArray = array();
// Function to convert CSV into associative array
function csvToArray($file, $delimiter) {
if (($handle = fopen($file, 'r')) !== FALSE) {
$i = 0;
while (($lineArray = fgetcsv($handle, 4000, $delimiter, '"')) !== FALSE) {
for ($j = 0; $j < count($lineArray); $j++) {
$arr[$i][$j] = $lineArray[$j];
}
$i++;
}
fclose($handle);
}
return $arr;
}
// Do it
$data = csvToArray($feed, ',');
// Set number of elements (minus 1 because we shift off the first row)
$count = count($data) - 1;
//Use first row for names
$labels = array_shift($data);
foreach ($labels as $label) {
$keys[] = $label;
}
// Add Ids, just in case we want them later
$keys[] = 'id';
for ($i = 0; $i < $count; $i++) {
$data[$i][] = $i;
}
// Bring it all together
for ($j = 0; $j < $count; $j++) {
$d = array_combine($keys, $data[$j]);
$newArray[$j] = $d;
}
// Print it out as JSON
echo json_encode($newArray);
?>
@aendra-rininsland

Copy link
Copy Markdown

Great script, saved me a bunch of time for an interactive I was working on for the Guardian.

Couple quick things --
a. I was getting PHP warnings on ln. 54. Adding an @ in from of array_combine(); suppresses that.
b. If you're wanting the JSON to be consumed on a different domain than the one hosting the PHP (i.e., through jQuery's getJSON(); function), you'll need a way around AJAX's same domain origin policy. I've done so by changing the header to script/javascript and replacing line 59 with echo $_GET['callback']. '(' . json_encode($newArray) . ');';. This allows you to consume the output through JSONP by attaching a callback variable to the path (e.g., "?callback=mycallback").

@robflaherty

Copy link
Copy Markdown
Author

Thanks! Regarding the PHP warnings, what version of PHP are you using?

@aendra-rininsland

Copy link
Copy Markdown

Sorry for the slow response -- I was using 5.2.17.

@dwharris

Copy link
Copy Markdown

Great script, thanks.

On a MAC add

ini_set("auto_detect_line_endings", true);

@Kostanos

Copy link
Copy Markdown

Great script. Thanks, In my fork I made it for command line use.

@russom-woldezghi

Copy link
Copy Markdown

Thank you.

@ValentinH

Copy link
Copy Markdown

Really nice!

@gruckion

Copy link
Copy Markdown

Licensing? am I free to use this or are there any restrictions?

@francolaiuppa

Copy link
Copy Markdown

We executed this for CSV dataset that we got and the results were incredible. Thank you!!!!!!

@ram-you

ram-you commented Jun 13, 2014

Copy link
Copy Markdown

Thank you. Saved me.

@dev-ext

dev-ext commented Aug 10, 2014

Copy link
Copy Markdown

Thank you. I make my portfolio based on your script.

@joshuaiz

Copy link
Copy Markdown

This is exactly what I needed.
It may be obvious but for anyone who needs to access the PHP created json via javascript, just use this:

<?php $json = json_encode($newArray); ?>
<script>
var $json = <?php echo $json; ?>;
// do your magic here
</script>

@albert-massey

Copy link
Copy Markdown

Thanks a million Rob! :)

@afenix

afenix commented Jun 19, 2015

Copy link
Copy Markdown

So awesome. Thanks much for the share! I was going to have to refactor a bunch of code, and this worked like a charm. I hope I can repay the favor one day.

@UTCWebDev

Copy link
Copy Markdown

I have a nested/setted JSON format I need to produce... Can anyone suggest how to format a spreadsheet to produce this: http://mapplic.com/plugin/mall.json

Or would that require a set of spreadsheets/CSVs?

@ur92

ur92 commented Feb 25, 2016

Copy link
Copy Markdown

Great Gist!

I forked it and shortened the csvToArray function to this:
$data = array_map('str_getcsv', file($feed));
as this is more compact and performance should be better.

Tested => works!

@hotgrandma69

Copy link
Copy Markdown

This is exactly what I was looking for! Thanks a million!!!!

ghost commented Jun 9, 2016

Copy link
Copy Markdown

My file path for my images is folder/imagename.jpg.

When I run this great script, this is the only thing throwing an error. The path come out as folder/imagename.jpg

Here is the screenshot of the issue:
http://i.imgur.com/t0GQAEv.jpg

Also, can the output be saved to a .json file rather than within the PHP?

@JohanDuran

Copy link
Copy Markdown

Really useful. Thanks.

@imsabin

imsabin commented Jul 2, 2017

Copy link
Copy Markdown

hi, my server has disabled fopen. so is there any alternative like using curl to get the same result??

@aarondunphy

Copy link
Copy Markdown

Thanks for this.

Tried using it in Laravel for my seeders with a csv file and ended up needing to move the csvToArray function outside and call it via $this->csvToArray() due to a redeclare issue.

@devfaysal

Copy link
Copy Markdown

Great gist. I took inspiration from this and made a simplified version.
https://gist.github.com/devfaysal/9143ca22afcbf252d521f5bf2bdc6194

@chanakaDe

Copy link
Copy Markdown

Can anyone tell me why I'm getting "/ufeff" in my JOSN array ?

@bhavin-rb

Copy link
Copy Markdown

Hi, Can anyone please help me with this problem of:
Error with Permissions-Policy header: Origin trial controlled feature not enabled: 'interest-cohort'.

API:
https://bhavin-rb.github.io/math_quiz_1/algebra1_api.json

App:
https://bhavin-rb.github.io/algebra1_quiz/

The quiz app works fine from local host and when I published on Github it gave the above error. I made a json file as API and fetching the API that contains the questions and answer options from Github pages. As I said, locally everything is working fine.
Kindly, assist to resolve this problem. Thank you.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment