You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 12:45:00