2012-01-17 32 views
1

我正在嘗試編寫一個PHP腳本來備份我的Gmail聯繫人。使用PHP將Gmail聯繫人導出爲CSV

爲了查詢聯繫人,我找到了一篇描述使用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) "[email protected]" 
      } 
     ["phoneNumber"] => array(2) 
      { 
       [0] => string(3) "123" 
       [1]=> string(3) "321" 
      } 
    } 
+0

也許向我們展示一些您的代碼...?如果你正在得到你想要的信息,但是不能創建一個CSV文件,那肯定是問題所在...... – DaveRandom 2012-01-17 10:02:45

+0

$ master = array(); $ fp = fopen('file。csv','w'); foreach($ results as $ r) { \t $ master [0] =(string)$ r-> name; \t $ master [1] =(string)$ r-> orgName; \t $ master [2] =(string)$ r-> orgTitle; \t $ iCount = 2; \t foreach($ r-> phoneNumber as $ p) \t { \t \t $ iCount + = 1; \t \t $ master [$ iCount] =(string)$ r-> phoneNumber; \t} \t fputcsv($ fp,$ master); } fclose($ fp); – user1153607 2012-01-17 10:05:04

+0

我的問題是我沒有檢索到所需信息級別附近的任何地方。我想知道是否有使用Zend登錄Gmail,然後查詢以下地址「http://mail.google.com/mail/contacts/data/export?exportType=ALL&groupToExport=&out=OUTLOOK_CSV」 – user1153607 2012-01-17 10:06:45

回答

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.該解決方案循環數據兩次以動態構建列布局。這將是一個較慢的解決方案,它可以通過嚴格定義列布局來加速,但是這可能會導致列數太多,某些數據爲空,或者列數不夠,一些數據丟失。

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