所以这就是问题所在。我从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的第一行是标题,下面的数据是需要对齐的数据。未来的请求也会有多行数据,他们也需要与标题匹配。有什么想法吗?
答案 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;但它有效......
$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");
是解决方案的一部分。还有其他人吗?