Третьим вариантом является рефакторинг тела цикла как функции, а затем вызов этой функции в первой строке перед входом в цикл.Вы можете использовать fputcsv
в качестве этой функции.
$csv_stream = fopen('php://temp', 'r+');
if ($row = $result->fetch_assoc()) {
fputcsv($csv_stream, array_keys($row));
fputcsv($csv_stream, $row);
while ($row = $result->fetch_row()) {
fputcsv($csv_stream, $row);
}
fseek($csv_stream, 0);
}
$csv_data = stream_get_contents($csv_stream);
if ($this->debugFlag) {
echo "Step 4 (repeats for each attachment): CSV file built. \n\n";
}
// Return the completed file
return $csv_data;
Поскольку это в основном то же самое, что и цикл do ... while
, который имеет больше смысла в использовании.Я привел эту альтернативу, чтобы представить технику рефакторинга тела цикла, которую можно использовать, когда цикл другого типа не имеет смысла.
Лучше всего было бы использовать mysqli_result::fetch_fields
и fputcsv
$csv_stream = fopen('php://temp', 'r+');
$fields = $result->fetch_fields();
foreach ($fields as &$field) {
$field = $field->name;
}
fputcsv($csv_stream, $fields);
while ($row = $result->fetch_row()) {
fputcsv($csv_stream, $row);
}
fseek($csv_stream, 0);
$csv_data = stream_get_contents($csv_stream);
if ($this->debugFlag) {
echo "Step 4 (repeats for each attachment): CSV file built. \n\n";
}
// Return the completed file
return $csv_data;
Если вы можете потребовать, чтобы PHP был как минимум версии 5.3, вы можете заменить foreach
, генерирующий строку заголовка, вызовом array_map
.По общему признанию, нет большого преимущества в этом, я просто нахожу функциональный подход более интересным.
fputcsv($csv_stream,
array_map(function($field) {return $field->name},
$result->fetch_fields()));