fputcsv не может отформатировать строку
Есть функция, которая отлично записывает данные в файл и сохраняет его на "лету". Вот только проблема в том, что когда пытаюсь отформатировать данные для resultArray, через fputcsv, он не может этого сделать и возвращает:
Веб-страница по адресу ***, возможно, временно недоступна или постоянно перемещена по новому адресу
Однако для более простого массива selectedColumn всё получается. Ниже приведены код и resultArray. Не могу понять почему так происходит. Может массив не верно составлен и не может из-за этого отформатироваться?
Код:
function checkEmptyField($field)
{
if(empty($field))
{
return '-';
}else
{
return $field;
}
}
$nameFile = 'keywords.csv';
$handle = fopen("php://output", "w");
header('Content-disposition: attachment; filename='.$nameFile);
header('Content-Type: text/csv; charset=UTF-8');
// Create head of table
$selectedColumn = [];
foreach ($clientColumns as $key=>$val)
{
if($val == 1)
{
$selectedColumn [] = $key;
}
}
// Create body of table
$resultArray = [$selectedColumn];
foreach ($keywordsCharacteristic as $fields)
{
$tempRow = [];
foreach ($selectedColumn as $column)
{
switch ($column) {
case "features":
$tempRow [] = $fields['serpFeatures'];
break;
case "position":
$tempRow [] = checkEmptyField($fields['position']);
break;
case "traffic":
$tempRow [] = checkEmptyField($fields['traffic']);
break;
case "volume":
$tempRow [] = checkEmptyField($fields['volume']);
break;
case "CPC":
$tempRow [] = checkEmptyField($fields['cpc']);
break;
case "url":
$tempRow [] = checkEmptyField($fields['pageUrl']);
break;
case "checked":
$tempRow [] = checkEmptyField($fields['checked']);
break;
}
}
$resultArray [] = $tempRow;
}
var_dump($resultArray);
//fputcsv($handle, $resultArray);
fclose($handle);
exit();
По поводу resultArray. Даже если я уберу поля, соответствующие features, то результата также не будет, хотя массив станет таким же, как в примере из документации, только крупнее.
Поле, соответствующие
features:
[0]=> array(2) { [0]=> array(3) { ["key"]=> string(7) "reviews" ["img"]=> string(11) "reviews.png" ["name"]=> string(7) "Reviews" } [1]=> array(3) { ["key"]=> string(15) "relatedSearches" ["img"]=> string(12) "Searches.png" ["name"]=> string(16) "Related Searches" } }
array(3) {
[0]=>
array(7) {
[0]=>
string(8) "features"
[1]=>
string(8) "position"
[2]=>
string(7) "traffic"
[3]=>
string(6) "volume"
[4]=>
string(3) "CPC"
[5]=>
string(3) "url"
[6]=>
string(7) "checked"
}
[1]=>
array(7) {
[0]=>
array(2) {
[0]=>
array(3) {
["key"]=>
string(7) "reviews"
["img"]=>
string(11) "reviews.png"
["name"]=>
string(7) "Reviews"
}
[1]=>
array(3) {
["key"]=>
string(15) "relatedSearches"
["img"]=>
string(12) "Searches.png"
["name"]=>
string(16) "Related Searches"
}
}
[1]=>
string(1) "-"
[2]=>
string(1) "-"
[3]=>
string(1) "-"
[4]=>
string(1) "-"
[5]=>
string(1) "-"
[6]=>
string(10) "2022-02-07"
}
[2]=>
array(7) {
[0]=>
array(3) {
[0]=>
array(3) {
["key"]=>
string(7) "reviews"
["img"]=>
string(11) "reviews.png"
["name"]=>
string(7) "Reviews"
}
[1]=>
array(3) {
["key"]=>
string(5) "tweet"
["img"]=>
string(9) "tweet.png"
["name"]=>
string(5) "Tweet"
}
[2]=>
array(3) {
["key"]=>
string(15) "relatedSearches"
["img"]=>
string(46) "Searches.png"
["name"]=>
string(16) "Related Searches"
}
}
[1]=>
string(1) "3"
[2]=>
string(1) "-"
[3]=>
string(1) "-"
[4]=>
string(1) "-"
[5]=>
string(1) "-"
[6]=>
string(10) "2022-02-07"
}
}
Ответы (1 шт):
Решено
Причиной было то, что я не пропускал resultArray через foreach и у меня передавался массив как элемент, вместо поэлементной записи. Проблему с features решил через array_merge. Результирующий код выглядит так:
$nameFile = 'keywords.csv';
$handle = fopen("php://output", "w");
header('Content-disposition: attachment; filename='.$nameFile);
header('Content-Type: text/csv; charset=UTF-8');
// Create head of table
$selectedColumn = ['keyword'];
foreach ($clientColumns as $key=>$val)
{
if($val == 1)
{
$selectedColumn [] = $key;
}
}
// Create body of table
$resultArray = [$selectedColumn];
foreach ($keywordsCharacteristic as $fields)
{
$tempRow = ["\"".$fields['keyword']."\""];
foreach ($selectedColumn as $column)
{
switch ($column) {
/* Код из вопроса тут не менялся */
}
}
$resultArray [] = $tempRow;
}
foreach ($resultArray as $key=>$item){
$stringFeatures = '';
if(is_array($item[1])){
foreach ($item[1] as $serpFeatures){
if($serpFeatures['key'] == end($item[1])['key']){
$stringFeatures .= $serpFeatures['key'];
}else{
$stringFeatures .= $serpFeatures['key'].", ";
}
}
unset($item[1]);
$res = array_merge(array_slice($item, 0, 1, true),
array(1 => "\"$stringFeatures\""),
array_slice($item, 1, count($item), true) );
unset($stringFeatures);
fputcsv($handle, $res, ";", '"');
}else{
fputcsv($handle, $item, ";", '"');
}
}
fclose($handle);
exit();