我正在尝试编写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"
}
}
答案 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);