Экспорт контактов Gmail в CSV с использованием PHP - PullRequest
1 голос
/ 17 января 2012

Я пытаюсь написать PHP-скрипт для резервного копирования моих контактов Gmail.

Я нашел статью, в которой описано использование инфраструктуры Zend в сочетании с API контактов Google для запроса контактов, мне удалосьзаставить его работать, однако количество возвращаемой информации далеко не адекватно.

Вот статья: 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 Ответ

2 голосов
/ 17 января 2012

Попробуйте этот код:

$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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...