0

this could have been asked over and over again but i have failed to get the best answer allover google. Please help me.

Problem

Am fetching data from a forex rates rest API and this is exactly how the reply looks when i print it out.

EUR/USD,1380039070258,1.34,868,1.34,873,1.34641,1.35193,1.34932
USD/JPY,1380039068699,98.,789,98.,797,98.471,99.180,98.838
GBP/USD,1380039067482,1.60,082,1.60,095,1.59546,1.60500,1.60419
EUR/GBP,1380039067816,0.84,245,0.84,256,0.84067,0.84495,0.84127
USD/CHF,1380039064893,0.91,161,0.91,172,0.90974,0.91338,0.91097
EUR/JPY,1380039066371,133.,236,133.,252,132.697,134.008,133.371
EUR/CHF,1380039063317,1.22,951,1.22,966,1.22853,1.23050,1.22919
USD/CAD,1380039062062,1.02,960,1.02,969,1.02655,1.03111,1.02841
AUD/USD,1380039069019,0.93,957,0.93,968,0.93635,0.94329,0.94307
GBP/JPY,1380039066561,158.,149,158.,170,157.342,158.978,158.552

Note that each line contains comma delimited data and the next line is on the next line.

When i store this data in a response variable $resp and use the code below

$result=str_getcsv($resp, "\n");
pr($result);

I get the expected result as below

Array
(
    [0] => EUR/USD,1380039070258,1.34,868,1.34,873,1.34641,1.35193,1.34932
    [1] => USD/JPY,1380039068699,98.,789,98.,797,98.471,99.180,98.838
    [2] => GBP/USD,1380039067482,1.60,082,1.60,095,1.59546,1.60500,1.60419
    [3] => EUR/GBP,1380039067816,0.84,245,0.84,256,0.84067,0.84495,0.84127
    [4] => USD/CHF,1380039064893,0.91,161,0.91,172,0.90974,0.91338,0.91097
    [5] => EUR/JPY,1380039066371,133.,236,133.,252,132.697,134.008,133.371
    [6] => EUR/CHF,1380039063317,1.22,951,1.22,966,1.22853,1.23050,1.22919
    [7] => USD/CAD,1380039062062,1.02,960,1.02,969,1.02655,1.03111,1.02841
    [8] => AUD/USD,1380039069019,0.93,957,0.93,968,0.93635,0.94329,0.94307
    [9] => GBP/JPY,1380039066561,158.,149,158.,170,157.342,158.978,158.552
    [10] => 
)

This works perfectly on my localhost server but when i deploy it, i get an error below

Call to undefined function str_getcsv()

It seams the server doesn't know about that str_getcsv() function i tried to use.

I tried to use other functions like fgetcsv() but cant get them to give me the array output i want.

below is how i used fgetcsv()

$fh = fopen('php://memory', 'rw'); 
fwrite($fh, $resp);
rewind($fh);
$result = fgetcsv( $fh, strlen($resp), ',', ' ');
fclose($fh); 
pr($result);

but it picks only the first line of the $resp string and here is the output it gives

Array
(
    [0] => EUR/USD
    [1] => 1380040007538
    [2] => 1.34
    [3] => 882
    [4] => 1.34
    [5] => 890
    [6] => 1.34641
    [7] => 1.35193
    [8] => 1.34932
)

yet i want all the lines of the $resp string indexed in the array like in the first array

Please if you can help me get this to work by converting the string to the desired array, thanks inadvance.

Hillary Namanya
  • 93
  • 4
  • 13
  • str_getcsv() was added in php 5.3. Your server should get updated. Your expected array is NOT parsing the csv data. it's simply returning each line of the file as a solid single line. You could get EXACTLY the same results with `file()` - each line returned as an element of an array. – Marc B Sep 24 '13 at 16:27
  • Thank you Marc, i should that should be the problem with the server, but isn't there a work around, thanks again. – Hillary Namanya Sep 24 '13 at 16:30

2 Answers2

1

You can use explode("\n", $resp) to get array of lines.

Elon Than
  • 9,603
  • 4
  • 27
  • 37
  • 1
    your `explode` parameters are in wrong order it is `array explode ( string $delimiter , string $string [, int $limit ] )` – bansi Sep 24 '13 at 16:29
  • Thanks @ElonThan, I was actually thinking of something more complex but the explode function worked as a quick charm. Thanks again. – Hillary Namanya Sep 24 '13 at 20:20
0

People are right when they tell you to check the documentation or Google. Developing software is not just about typing code but also a good part of reading and research.

The error your server produces is very likely because you run an ancient php version and should update it - security is a keyword here as well. Because this function http://php.net/manual/en/function.str-getcsv.php is supported since 5.3.

Further the first comment there includes an example of how to archive the same thing without that function:

function csv_to_array($filename='', $delimiter=',')
{
    if(!file_exists($filename) || !is_readable($filename))
        return FALSE;

    $header = NULL;
    $data = array();
    if (($handle = fopen($filename, 'r')) !== FALSE)
    {
        while (($row = fgetcsv($handle, 1000, $delimiter)) !== FALSE)
        {
            if(!$header)
                $header = $row;
            else
                $data[] = array_combine($header, $row);
        }
        fclose($handle);
    }
    return $data;
}

I have not tested it, that's your job.

The comment after that has an even more detailed replacement if the function is missing.

floriank
  • 25,546
  • 9
  • 42
  • 66