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

时间:2012-01-17 09:57:25

标签: php csv gmail

我正在尝试编写PHP脚本来备份我的Gmail联系人。

我发现一篇文章描述了使用Zend框架与Google Contacts API结合使用以查询联系人,我设法使其工作,但返回的信息量远远不够。

以下是文章:http://www.ibm.com/developerworks/opensource/library/x-phpgooglecontact/index.html

这是我的代码:

$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()的输出:

object(stdClass)#7 (5)
    {
        ["name"] => string(17) "John Doe"
        ["orgName"] => string(6) "Some Org"
        ["orgTitle"] => string(0) ""
        ["emailAddress"] => array(1)
            {
                [0]=> string(17) "user@domain.com"
            }
        ["phoneNumber"] => array(2)
            {
                [0] => string(3) "123"
                [1]=> string(3) "321"
            }
     }

1 个答案:

答案 0 :(得分:2)

试试这段代码:

$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);

此代码不会将电子邮件地址添加到文件中,因为您尚未在代码中使用它们,但可以通过将array_merge()行更改为此来轻松添加:

$item = array_merge($item, $r->phoneNumber, $r->emailAddress);

这会导致电子邮件地址出现在每行的末尾。要让它们出现在其他地方,您只需要将提供参数的顺序更改为array_merge()

无论其 ...

根据您的代码,上面的代码将导致难以解析的CSV文件。这是因为联系人可以拥有不同数量的电话号码和电子邮件地址。 CSV文件应该是一个表,具有明确定义的列和每行中相同的列数。出于这个原因,你最好做这样的事情:

N.B。此解决方案将数据循环两次,以便动态构建列布局。这将是一个较慢的解决方案,它可以通过严格定义列布局来加速,但这可能会导致列太多,一些列数据为空,或列数量不足,一些数据丢失。 < / p>

$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);