【问题标题】:Export Gmail Contacts to CSV using PHP使用 PHP 将 Gmail 联系人导出为 CSV
【发布时间】:2012-01-17 19:25:58
【问题描述】:

我正在尝试编写一个 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"
            }
     }

【问题讨论】:

  • 也许向我们展示您的一些代码...?如果您获得了所需的信息但无法创建 CSV 文件,那肯定是问题所在......
  • $master = array(); $fp = fopen('file.csv', 'w'); foreach ($results as $r) { $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) $r->phoneNumber; } fputcsv($fp, $master); } fclose($fp);
  • 我的问题是我没有检索到接近所需信息水平的任何地方。想知道有没有办法用Zend登录Gmail,然后查询下面的地址“mail.google.com/mail/contacts/data/…
  • 您在文件中得到什么结果?你能指望什么?关于该代码错误的第一件事是,在内部foreach 循环中,您使用了$r->phoneNumber,它可能应该是$p。而且您不会在每次迭代时都重置 $master 数组,因此您最终可能会得到重复的数据。
  • 请使用var_dump($results);的输出编辑您的问题

标签: php csv gmail


【解决方案1】:

试试这个代码:

$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 文件应该是一个表格,具有明确定义的列并且每行中的列数相同。出于这个原因,你最好做这样的事情:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-14
    • 1970-01-01
    • 2015-07-01
    相关资源
    最近更新 更多