PHP curl响应字符串拆分


PHP curl Response string splitting

所以问题就在这里。我正在从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)"数字","名称","描述","类型","固定宽度布尔值","引号","分隔符","行尾序列","标题布尔值"answers"列计数"1","所有呼叫","全部呼叫数据","呼叫","false","None",","''r''n","true","14"

这是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的第一行是标题,下面的数据是它需要对齐的数据。此外,未来的请求将有多行数据,它们也需要与标题匹配。有什么想法吗?

如果您正在处理CSV,请尝试使用内置函数。然后使用array_component将您的标题粘贴为关键字:

$response = curl_exec($ch);
$csv_data = array_map('str_getcsv', explode("'n", $response));
$headers = array_shift($csv_data);
foreach ($csv_data as $v) {
    $data[] = array_combine($headers, $v);
}

例如:

$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;
$csv_data = array_map('str_getcsv', explode("'n", $response));
$headers = array_shift($csv_data);
foreach ($csv_data as $v) {
    $data[] = array_combine($headers, $v);
}
print_r($data);

输出:

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] => 'r'n
            [Header Boolean] => true
            [Column Count] => 14
        )
)

您还可以将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
        )
)
*/

好吧,这有点"技巧",但它有效。。。。

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"
 )