将逗号分隔的字符串转换为数组,如csv字符串,而不使用str_getcsv函数

时间:2013-09-24 16:22:33

标签: php zend-framework cakephp csv fgetcsv

这可能一次又一次被问到但是我没有得到最好的答案全面谷歌。请帮帮我。

问题

我从外汇汇率中获取数据,这正是我打印时回复的样子。

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

请注意,每一行都包含逗号分隔数据,下一行位于下一行。

当我将此数据存储在响应变量$resp中并使用下面的代码时

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

我得到预期的结果如下

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] => 
)

这在我的localhost服务器上完美运行,但是当我部署它时,我得到一个错误

Call to undefined function str_getcsv()

它接缝服务器不知道我试图使用的str_getcsv()功能。

我尝试使用其他功能,例如fgetcsv(),但无法让他们给我{i}我想要的。{/ p>

下面是我如何使用fgetcsv()

array output

但它只选择$fh = fopen('php://memory', 'rw'); fwrite($fh, $resp); rewind($fh); $result = fgetcsv( $fh, strlen($resp), ',', ' '); fclose($fh); pr($result); 字符串的第一行,这是它给出的输出

$resp

但是我想要在数组中索引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 ) 字符串的所有行,就像在第一个数组中一样

如果您能通过将字符串转换为所需的数组来帮助我解决此问题,请多谢。

2 个答案:

答案 0 :(得分:1)

您可以使用explode("\n", $resp)获取一系列行。

答案 1 :(得分:0)

当他们告诉您查看文档或Google时,他们是对的。开发软件不仅仅是打字代码,也是阅读和研究的重要组成部分。

您的服务器产生的错误很可能是因为您运行了一个古老的php版本并且应该更新它 - security也是一个关键字。因为自5.3以来支持此功能http://php.net/manual/en/function.str-getcsv.php

此外,第一条评论中包含了一个如何在没有该功能的情况下归档同一件事的例子:

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;
}

我没有测试过,这是你的工作。

如果函数丢失,

The comment after that会有更详细的替换。

相关问题