PHP中json_encode($opportunities)无输出问题排查(禁用array_combine)
问题描述
不使用array_combine()函数将CSV文件转换为JSON格式时遇到异常:print_r($opportunities)能正常输出数组内容,但echo json_encode($opportunities)无任何输出,而json_encode($headers)可以正常工作。需要生成指定格式的JSON输出,相关代码及输出示例如下:
原代码
<?php header('Cache-Control: no-cache, must-revalidate'); header('Content-type: application/json; charset=utf-8'); $file = 'Opportunities.csv'; $handle = fopen($file, "r"); if ($handle !== FALSE) { $csvs = []; $headers = []; $oppertunities = []; while(! feof($handle)) { $csvs[] = fgetcsv($handle); } foreach ($csvs[0] as $single_csv) { $headers[] = $single_csv; } foreach ($csvs as $key => $csv) { if ($key === 0) { continue; } foreach ($headers as $header_key => $header) { $opportunities[$key-1][$header] = $csv[$header_key]; } } fclose($handle); print_r($headers); // 输出正常 print_r($opportunities); // 输出正常 echo json_encode($headers); // 输出正常 echo json_encode($opportunities); // 无输出,原因? } ?>
相关输出
print_r($headers)输出:
Array ( [0] => NoticeId [1] => Title [2] => Sol# [3] => Department/Ind.Agency [4] => CGAC [5] => Sub-Tier [6] => FPDS Code [7] => Office [8] => AAC Code [9] => PostedDate [10] => Type [11] => BaseType [12] => ArchiveType [13] => ArchiveDate [14] => SetASideCode [15] => SetASide [16] => ResponseDeadLine [17] => NaicsCode [18] => ClassificationCode [19] => PopStreetAddress [20] => PopCity [21] => PopState [22] => PopZip [23] => PopCountry [24] => Active [25] => AwardNumber [26] => AwardDate [27] => Award$ [28] => Awardee [29] => PrimaryContactTitle [30] => PrimaryContactFullname [31] => PrimaryContactEmail [32] => PrimaryContactPhone [33] => PrimaryContactFax [34] => SecondaryContactTitle [35] => SecondaryContactFullname [36] => SecondaryContactEmail [37] => SecondaryContactPhone [38] => SecondaryContactFax [39] => OrganizationType [40] => State [41] => City [42] => ZipCode [43] => CountryCode [44] => AdditionalInfoLink [45] => Link [46] => Description )
print_r($opportunities)输出:
Array ( [0] => Array ( [NoticeId] => 3t54654tyj54ty1gh5 [Title] => Solicitation for Services Contractor Level [Sol#] => 72MC1023R00002 [Department/Ind.Agency] => AGENCY FOR DEVELOPMENT [CGAC] => 72 [Sub-Tier] => AGENCY FOR DEVELOPMENT [FPDS Code] => 7200 [Office] => USAID M/CIO [AAC Code] => 72MC10 [PostedDate] => 48:44.6 [Type] => Combined Synopsis/Solicitation [BaseType] => Combined Synopsis/Solicitation [ArchiveType] => auto15 [ArchiveDate] => 5/15/2023 [SetASideCode] => [SetASide] => [ResponseDeadLine] => 2023-04-30T11:00:00-04:00 [NaicsCode] => 541990 [ClassificationCode] => R497 [PopStreetAddress] => [PopCity] => Washington [PopState] => DC [PopZip] => 20523 [PopCountry] => USA [Active] => Yes [AwardNumber] => [AwardDate] => [Award$] => [Awardee] => [PrimaryContactTitle] => [PrimaryContactFullname] => first name last name [PrimaryContactEmail] => name@email.com [PrimaryContactPhone] => 2029162947 [PrimaryContactFax] => [SecondaryContactTitle] => [SecondaryContactFullname] => [SecondaryContactEmail] => [SecondaryContactPhone] => [SecondaryContactFax] => [OrganizationType] => OFFICE [State] => DC [City] => WASHINGTON [ZipCode] => 20523 [CountryCode] => USA [AdditionalInfoLink] => [Link] => https://somelink.com/index.php [Description] => Some text.... )
json_encode($headers)输出:
[ "NoticeId", "Title", "Sol#", "Department/Ind.Agency", "CGAC", "Sub-Tier", "FPDS Code", "Office", "AAC Code", "PostedDate", "Type", "BaseType", "ArchiveType", "ArchiveDate", "SetASideCode", "SetASide", "ResponseDeadLine", "NaicsCode", "ClassificationCode", "PopStreetAddress", "PopCity", "PopState", "PopZip", "PopCountry", "Active", "AwardNumber", "AwardDate", "Award$", "Awardee", "PrimaryContactTitle", "PrimaryContactFullname", "PrimaryContactEmail", "PrimaryContactPhone", "PrimaryContactFax", "SecondaryContactTitle", "SecondaryContactFullname", "SecondaryContactEmail", "SecondaryContactPhone", "SecondaryContactFax", "OrganizationType", "State", "City", "ZipCode", "CountryCode", "AdditionalInfoLink", "Link", "Description" ]
期望的JSON格式
{ "0": { "NoticeId":"3t54654tyj54ty1gh5", "Title":"Solicitation for Services Contractor Level", "Sol#":"72MC1023R00002", "Department/Ind.Agency":"AGENCY FOR DEVELOPMENT", "CGAC":"72", "Sub-Tier":"AGENCY FOR DEVELOPMENT", "FPDS Code":"7200", "Office":"USAID M/CIO", "AAC Code":"72MC10", "PostedDate":"48:44.6", "Type":"Combined Synopsis/Solicitation", "BaseType":"Combined Synopsis/Solicitation", "ArchiveType":"auto15", "ArchiveDate":"5/15/2023", "SetASideCode":"", "SetASide":"", "ResponseDeadLine":"2023-04-30T11:00:00-04:00", "NaicsCode":"541990", "ClassificationCode":"R497", "PopStreetAddress":"", "PopCity":"Washington", "PopState":"DC", "PopZip":"20523", "PopCountry":"USA", "Active":"Yes", "AwardNumber":"", "AwardDate":"", "Award$":"", "Awardee":"", "PrimaryContactTitle":"", "PrimaryContactFullname":"first name last name", "PrimaryContactEmail":"name@email.com", "PrimaryContactPhone":"1234567890", "PrimaryContactFax":"", "SecondaryContactTitle":"", "SecondaryContactFullname":"", "SecondaryContactEmail":"", "SecondaryContactPhone":"", "SecondaryContactFax":"", "OrganizationType":"OFFICE", "State":"DC", "City":"WASHINGTON", "ZipCode":"20523", "CountryCode":"USA", "AdditionalInfoLink":"https://somelink.com/index.php", "Link":"", "Description":"Some text...." } }
问题原因及解决方案
1. 变量名拼写错误
原代码中初始化的变量是$oppertunities(拼写错误:第二个p后为e),但后续赋值使用的是$opportunities(正确拼写:第二个p后为o)。即使print_r能输出,该笔误也可能导致变量状态异常,影响json_encode执行。
修复:
将初始化的变量名改为正确的$opportunities:
$opportunities = [];
2. 字符编码不兼容
json_encode()仅支持UTF-8编码的字符串,若CSV文件包含非UTF-8字符(如ISO-8859-1、GBK等),会直接返回false,导致无输出。
修复方案:
读取CSV字段时统一转换为UTF-8编码,使用mb_convert_encoding()处理:
foreach ($headers as $header_key => $header) { $value = isset($csv[$header_key]) ? $csv[$header_key] : ''; // 若CSV原编码不是ISO-8859-1,需自行调整第二个参数 $opportunities[$key-1][$header] = mb_convert_encoding($value, 'UTF-8', 'ISO-8859-1'); }
3. 排查JSON编码错误
若上述修复后仍无输出,可通过以下代码获取具体错误信息:
$json = json_encode($opportunities); if ($json === false) { echo 'JSON编码错误:' . json_last_error_msg(); } else { echo $json; }
4. 生成期望的JSON格式
当前$opportunities是索引数组,json_encode默认输出JSON数组。若要生成{"0": {...}}的对象格式,需添加JSON_FORCE_OBJECT参数,搭配JSON_PRETTY_PRINT可格式化输出:
echo json_encode($opportunities, JSON_FORCE_OBJECT | JSON_PRETTY_PRINT);
完整修复后的代码
<?php header('Cache-Control: no-cache, must-revalidate'); header('Content-type: application/json; charset=utf-8'); $file = 'Opportunities.csv'; $handle = fopen($file, "r"); if ($handle !== FALSE) { $csvs = []; $headers = []; $opportunities = []; // 修正变量名拼写 while(! feof($handle)) { $csvs[] = fgetcsv($handle); } foreach ($csvs[0] as $single_csv) { // 转换表头编码 $headers[] = mb_convert_encoding($single_csv, 'UTF-8', 'ISO-8859-1'); } foreach ($csvs as $key => $csv) { if ($key === 0) { continue; } foreach ($headers as $header_key => $header) { $value = isset($csv[$header_key]) ? $csv[$header_key] : ''; // 转换内容编码 $opportunities[$key-1][$header] = mb_convert_encoding($value, 'UTF-8', 'ISO-8859-1'); } } fclose($handle); // 输出带格式的目标JSON echo json_encode($opportunities, JSON_FORCE_OBJECT | JSON_PRETTY_PRINT); } ?>
内容的提问来源于stack exchange,提问作者Frank Mata
相关产品推荐
相关产品推荐

