Попробуйте этот код:
$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);