PHP curl响应字符串拆分

时间:2015-12-03 23:10:13

标签: php csv curl

所以这就是问题所在。我从API中提取CSV文件,需要将其放入数组中。这是我目前的代码:

$url = "https://www.*****************";
$myvars = 'username=*********&password=*************';

$ch = curl_init( $url );
curl_setopt( $ch, CURLOPT_POST, 1);
curl_setopt( $ch, CURLOPT_POSTFIELDS, $myvars);
curl_setopt( $ch, CURLOPT_FOLLOWLOCATION, 1);
//curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: text'));
curl_setopt( $ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); 
curl_setopt($ch, CURLOPT_VERBOSE, true); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

if(!curl_exec($ch)){
    die('Error: "' . curl_error($ch) . '" - Code: ' . curl_errno($ch));
} else {
    $response = curl_exec($ch);
    $exploded = nl2br($response);   
    //echo $response."<br>";
    var_dump($exploded);
}
curl_close($ch);

问题是我收到了回复:

  

string(245)&#34;&#34; Number&#34;,&#34; Name&#34;,&#34; Description&#34;,&#34; Type&#34;,&#34 ;固定宽度布尔&#34;,&#34;引用字符&#34;,&#34;分隔符字符&#34;,&#34;行结束序列&#34;,&#34;标题布尔&#34;, &#34;列数&#34;   &#34; 1&#34;,&#34;所有通话&#34;,&#34;所有通话数据&#34;,&#34;通话&#34;,&#34;假&#34;,&# 34;无&#34;&#34;&#34;&#34; \ r \ n&#34;&#34;真&#34;&#34; 14&#34;   &#34;

这是CSV中的两行,但是出现在一个字符串行中。我试过爆炸它,但它似乎有两个分隔符,我试图拆分它,但它不会找到第二个分隔符。我希望它生成如下:

array(
"Number" => 1,
"Name" => "All Calls",
"Description" => "All Call Data",
"Type" => "Call",
"Fixed Width Boolean" => false,
"Quote Character" => "None",
"Delimiter Character" => ",",
"End of Line Sequence" => "\r\n",
"Header Boolean" => true,
"Column Count" => 14
);

CSV的第一行是标题,下面的数据是需要对齐的数据。未来的请求也会有多行数据,他们也需要与标题匹配。有什么想法吗?

5 个答案:

答案 0 :(得分:2)

如果您正在处理CSV,请尝试使用built-in function

#page-content-wrapper { height: 100%; }

答案 1 :(得分:1)

您还可以将csv字符串转换为文件指针,并在其上使用fgetcsv。以下是其工作原理的示例:

Josh:~$ php -a
Interactive shell

php > $data = <<<CSV
<<< > "col1","col2"
<<< > "d1",","
<<< > CSV;
php > echo $data;
"col1","col2"
"d1",","
php > $fp = fopen('data://text/plain,' . $data, 'r');
php > while (($row = fgetcsv($fp)) !== false) {
php {   var_dump($row);
php { }
array(2) {
  [0]=>
  string(4) "col1"
  [1]=>
  string(4) "col2"
}
array(2) {
  [0]=>
  string(2) "d1"
  [1]=>
  string(1) ","
}

使用您的示例,它将类似于以下

$response = <<<CSV
"Number","Name","Description","Type","Fixed Width Boolean","Quote Character","Delimiter Character","End of Line Sequence","Header Boolean","Column Count"
"1","All Calls","All Call Data","Call","false","None",",","\r\n","true","14"
CSV;
$fp = fopen('data://text/plain,' . $response, 'r');
$data = [];
$header = fgetcsv($fp); // first row is column headers
while (($row = fgetcsv($fp)) !== false) {
    $data[] = array_combine($header, $row);
}
print_r($data); // list of rows with keys set to column names from $header
/*
Array
(
    [0] => Array
        (
            [Number] => 1
            [Name] => All Calls
            [Description] => All Call Data
            [Type] => Call
            [Fixed Width Boolean] => false
            [Quote Character] => None
            [Delimiter Character] => ,
            [End of Line Sequence] =>

            [Header Boolean] => true
            [Column Count] => 14
        )

)
*/

答案 2 :(得分:-1)

"Delimiter Character" => ",",

这会给你一个问题,因为PHP也会爆炸那个逗号

答案 3 :(得分:-1)

嗯,这有点&#34; hacky&#34;但它有效......

PHP Fiddle

 $response = '"Number","Name","Description","Type","Fixed Width Boolean","Quote Character","Delimiter Character","End of Line Sequence","Header Boolean","Column Count","1","All Calls","All Call Data","Call","false","None",",","\r\n","true","14"'; 

 $response = preg_replace('/[,]/', "*", $response);
 $response = str_replace('*"*"*', '*","*', $response);

 $exploded = explode("*", $response);

 $count = count($exploded)/2;

 $newArray = [];

 for($i=0; $i<$count; ++$i){
     $newArray[$exploded[$i]] = $exploded[$i+$count];
 }

 print_r($newArray);

打印

 Array
 (
     ["Number"] => "1"
     ["Name"] => "All Calls"
     ["Description"] => "All Call Data"
     ["Type"] => "Call"
     ["Fixed Width Boolean"] => "false"
     ["Quote Character"] => "None"
     ["Delimiter Character"] => ","
     ["End of Line Sequence"] => "\r\n"
     ["Header Boolean"] => "true"
     ["Column Count"] => "14"
 )

答案 4 :(得分:-1)

我尝试了以下操作,结果如下:

$url = "https://www.*****************";
$myvars = 'username=*********&password=*************';

$ch = curl_init( $url );
curl_setopt( $ch, CURLOPT_POST, 1);
curl_setopt( $ch, CURLOPT_POSTFIELDS, $myvars);
curl_setopt( $ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt( $ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); 
curl_setopt($ch, CURLOPT_VERBOSE, true); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

if(!$response = curl_exec($ch)){
    die('Error: "' . curl_error($ch) . '" - Code: ' . curl_errno($ch));
} else {
    $strget = str_getcsv($response);    
    var_dump($strget);
}
curl_close($ch);

结果以数组形式返回:

Array ( 
    [0] => Number 
    [1] => Name 
    [2] => Description 
    [3] => Type 
    [4] => Fixed Width Boolean 
    [5] => Quote Character 
    [6] => Delimiter Character 
    [7] => End of Line Sequence 
    [8] => Header Boolean 
    [9] => Column Count "1" 
    [10] => All Calls 
    [11] => All Call Data 
    [12] => Call 
    [13] => false 
    [14] => None 
    [15] => , 
    [16] => \r\n 
    [17] => true 
    [18] => 14 
)

问题是应该有2个阵列,一个嵌套在另一个阵列中,或者在上面原始的所需解决方案中设置。主要问题是:

[9] => Column Count "1" 

就在这里,其他数组或换行符应该在哪里。我给你一个+1 miken32的典型正确答案。

<强>已更新

$ch = curl_init( $url );
curl_setopt( $ch, CURLOPT_POST, 1);
curl_setopt( $ch, CURLOPT_POSTFIELDS, $myvars);
curl_setopt( $ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt( $ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); 
curl_setopt($ch, CURLOPT_VERBOSE, true); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

if(!$response = curl_exec($ch)){
    die('Error: "' . curl_error($ch) . '" - Code: ' . curl_errno($ch));
} else {
    $strget = str_getcsv($response,"\n");   
    //echo $strget."<br>";
    print_r($strget);
}
curl_close($ch);

这输出以下内容:

Array ( 
    [0] => Number,"Name","Description","Type","Fixed Width Boolean","Quote Character","Delimiter Character","End of Line Sequence","Header Boolean","Column Count" 
    [1] => 1,"All Calls","All Call Data","Call","false","None",",","\r\n","true","14" 
)

所以str_getcsv($response,"\n");是解决方案的一部分。还有其他人吗?