#php #arrays #laravel #fputcsv
#php #массивы #laravel #fputcsv
Вопрос:
Первая часть кода работает нормально, но вторая (отображение результатов) работает неправильно. Если я вставляю $slugs = explode(',', $slugs)
внутрь foreach ($pma...)
, это выдает explode() expects parameter 2 to be string, array given
ошибку. Если я сохраню его в том виде, в каком он есть сейчас, он работает, но результаты выдаются в режиме «мозаичный, беспорядочный» с несколькими одинаковыми результатами. Даже print_r()
показывает 800 результатов в одной строке (это нонсенс).
Как это исправить?
$data = fopen('php://output', 'w');
$fields = rtrim($_GET['fieldnames'], ",");
$slugs = rtrim($_GET['slugs'], ",");
$fieldnames = array();
$fieldslugs = array();
$pma = DB::table... // long query
$fields = explode(',', $fields);
foreach ($fields as $field) {
$fieldnames[] = $field;
}
fputcsv($data, $fieldnames);
$slugs = explode(',', $slugs);
foreach ($pma as $p) {
foreach ($slugs as $slug) {
$fieldslugs[] = $p->$slug;
}
fputcsv($data, $fieldslugs);
}
Извините за плохой английский и спасибо за любые ответы!
Ответ №1:
Попробуйте это:
foreach ($pma as $p) {
$fieldslugs = [];
foreach ($slugs as $slug) {
$fieldslugs[] = $p->$slug;
}
fputcsv($data, $fieldslugs);
}
Вам необходимо сбрасывать массив для каждой итерации, иначе он будет продолжать заполнять один и тот же массив и, таким образом, добавлять новые результаты строк к каждой строке csv.
Ответ №2:
Вам нужно добавить $fieldslugs = [];
перед foreach
$fieldslugs = [];
foreach ($slugs as $slug) {
$fieldslugs[] = $p->$slug;
}
fputcsv($data, $fieldslugs);
Комментарии:
1. Спасибо. Это работает. Однако @riekelt ответил с объяснением, поэтому я приму его ответ.