PHPを使用してGmailの連絡先をCSVにエクスポートする
Gmailの連絡先をバックアップするためのPHPスクリプトを作成しようとしています。
連絡先をクエリするためにZendフレームワークをGoogleContactsAPIと組み合わせて使用することを説明した記事を見つけました。なんとか機能させることができましたが、返される情報の量は十分ではありません。
記事は次のとおりです: 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"
}
}
答え :
解決策:
このコードを試してください:
$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。このソリューションは、列レイアウトを動的に構築するために、データを2回ループします。これは遅い解決策であり、列のレイアウトを厳密に定義することで高速化できますが、列が多すぎるか、データが空であるか、列が不足してデータが失われる可能性があります。 < / 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);
同様の質問
私たちのウェブサイトで同様の質問で答えを見つけてください。