Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/237.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用PHP将Gmail联系人导出到CSV_Php_Csv_Gmail - Fatal编程技术网

使用PHP将Gmail联系人导出到CSV

使用PHP将Gmail联系人导出到CSV,php,csv,gmail,Php,Csv,Gmail,我正试图编写一个PHP脚本来备份我的Gmail联系人 我发现一篇文章描述了如何使用Zend框架和GoogleContactsAPI来查询联系人,我设法让它工作起来,但是返回的信息量远远不够 以下是文章: 这是我的代码: $fp = fopen('file.csv', 'w'); foreach ($results as $r) { $master = array(); $master[0] = (string) $r->name; $master[1] = (string) $

我正试图编写一个PHP脚本来备份我的Gmail联系人

我发现一篇文章描述了如何使用Zend框架和GoogleContactsAPI来查询联系人,我设法让它工作起来,但是返回的信息量远远不够

以下是文章:

这是我的代码:

$fp = fopen('file.csv', 'w');
foreach ($results as $r) {
  $master = array();
  $master[0] = (string) $r->name;
  $master[1] = (string) $r->orgName;
  $master[2] = (string) $r->orgTitle;
  $iCount = 2;
  foreach($r->phoneNumber as $p) {
    $iCount += 1;
    $master[$iCount] = (string) $p->phoneNumber;
  }
  fputcsv($fp, $master);
}
fclose($fp)
以下是var_dump()的输出:

请尝试以下代码:

$csvFile = 'file.csv';

// Open the CSV file for writing
if (!$fp = fopen($csvFile, 'w')) {
  exit("Unable to open '$csvFile' for writing");
}

// Loop results
foreach ($results as $r) {
  // Build base array
  $item = array($r->name, $r->orgName, $r->orgTitle);
  // Add phone numbers to array
  $item = array_merge($item, $r->phoneNumber);
  // Write to CSV file
  fputcsv($fp, $item);
}

fclose($fp);
此代码不会将电子邮件地址添加到文件中,因为您没有在代码中使用它们,但可以通过将行更改为以下内容轻松添加:

$item = array_merge($item, $r->phoneNumber, $r->emailAddress);
这将导致电子邮件地址出现在每行的末尾。要让它们出现在其他地方,只需更改向
array\u merge()
提供参数的顺序

然而

基于您的代码,上面的代码将生成难以解析的CSV文件。这是因为联系人可以有不同数量的电话号码和电子邮件地址。CSV文件应该是一个表,具有定义良好的列,并且每行中的列数相同。出于这个原因,您最好这样做:

注意:此解决方案将数据循环两次,以便动态构建列布局。这是一个较慢的解决方案,可以通过严格定义列布局来加快速度,但这可能会导致列太多,有些列的数据为空,或者列不够,有些数据丢失

$csvFile='file.csv';
//循环数据以构造电子邮件和电话号码的最大数量
$numTels=$nummails=0;
foreach(结果为$r){
如果(count($r->phoneNumber)>numTels)$numTels=count($r->phoneNumber);
如果(count($r->emailAddress)>numEmails)$numEmails=count($r->emailAddress);
}
//打开CSV文件进行写入
如果(!$fp=fopen($csvFile,'w')){
退出(“无法打开“$csvFile”进行写入”);
}
//构造列标题行并写入文件
$colHeaders=“名称、组织名称、组织标题”;
对于($i=0;$i<$numTels;$i++)$colHeaders=“,tel_$i”;
对于($i=0;$i<$numails;$i++)$colHeaders=“,email_$i”;
fwrite($fp,“$colHeaders\n”);
//构造行并将行写入文件
foreach(结果为$r){
$item=array($r->name,$r->orgName,$r->orgTitle);
对于($i=0;$i<$numTels;$i++)$item[]=(isset($r->phoneNumber[$i])?$r->phoneNumber[$i]:“”;
对于($i=0;$i<$numails;$i++)$item[]=(isset($r->emailAddress[$i])?$r->emailAddress[$i]:“”;
fputcsv($fp$item);
}
fclose($fp);

也许可以给我们看看您的一些代码。。。?如果您正在获取所需信息,但无法创建CSV文件,那么问题肯定就出在这里…$master=array()$fp=fopen('file.csv','w');foreach($r){$master[0]=(字符串)$r->name;$master[1]=(字符串)$r->orgName;$master[2]=(字符串)$r->orgTitle;$iCount=2;foreach($r->phoneNumber as$p){$iCount+=1;$master[$iCount]=(字符串)$r->phoneNumber;}fputcsv($fp,$master);}fclose($fp);我的问题是,我没有检索到任何接近所需信息水平的信息。我想知道是否有任何方法可以使用Zend登录Gmail,然后查询以下地址“你在文件中得到了什么结果?”?你期待什么?关于该代码,我首先感到错误的是,在内部
foreach
循环中,您使用了
$r->phoneNumber
,它可能应该在
$p
的位置。并且您不会在每次迭代时重置
$master
数组,因此您可能会得到重复的数据。请使用
var\u dump($results)的输出编辑您的问题
$item = array_merge($item, $r->phoneNumber, $r->emailAddress);
$csvFile = 'file.csv';

// Loop the data to construct the maximum number of emails and telephone numbers
$numTels = $numEmails = 0;
foreach ($results as $r) {
  if (count($r->phoneNumber) > $numTels) $numTels = count($r->phoneNumber);
  if (count($r->emailAddress) > $numEmails) $numEmails = count($r->emailAddress);
}

// Open the CSV file for writing
if (!$fp = fopen($csvFile, 'w')) {
  exit("Unable to open '$csvFile' for writing");
}

// Construct the column headers row and write to file
$colHeaders = "name,orgname,orgtitle";
for ($i = 0; $i < $numTels; $i++) $colHeaders = ",tel_$i";
for ($i = 0; $i < $numEmails; $i++) $colHeaders = ",email_$i";
fwrite($fp, "$colHeaders\n");

// Construct and write rows to file
foreach ($results as $r) {
  $item = array($r->name, $r->orgName, $r->orgTitle);
  for ($i = 0; $i < $numTels; $i++) $item[] = (isset($r->phoneNumber[$i])) ? $r->phoneNumber[$i] : '';
  for ($i = 0; $i < $numEmails; $i++) $item[] = (isset($r->emailAddress[$i])) ? $r->emailAddress[$i] : '';
  fputcsv($fp, $item);
}

fclose($fp);