将Json转换为CSV的PHP脚本

将Json转换为CSV的PHP脚本,php,json,csv,Php,Json,Csv,我有一个API JSON服务,需要创建一个脚本将数据导出到CSV文件。 有人有php脚本将JSON迁移到CSV格式吗 示例Json文件 {"packWidth":200, "itemNo":"SEH404", "groupItemNo":"SEH404", "status":1, "categoryId":24356, "packType":"ColorBox", "barcode":"1234567890987", "modelLabel":"Color",

我有一个API JSON服务,需要创建一个脚本将数据导出到CSV文件。 有人有php脚本将JSON迁移到CSV格式吗

示例Json文件

  {"packWidth":200,
  "itemNo":"SEH404",
  "groupItemNo":"SEH404",
  "status":1,
  "categoryId":24356,
  "packType":"ColorBox",
  "barcode":"1234567890987",
  "modelLabel":"Color",
  "modelList":[{"key":"SEH404","value":"Black"},{"key":"SEH404W","value":"White"}],
  "packQty":20,
  "packInclude":"USB Adapter, USB Charger, Earphone, Leather Case",
  "id":3456}
一个重要的部分是带有标记“modelList”的数组


数组模型列表的结果必须是每个值的一列

例如:

packWidth、itemNo、groupItemNo、status、categoryId、packType、条形码、modelLabel、modelList1、modelList2、packQty、packInclude、id

200,SEH404,SEH404,124356,色盒,1234567890987,颜色,SEH404:黑色,SEH404W:白色,20,USB适配器,3456

某些产品可能还包含5条记录“modelList1-modelList2 modelList3-modelList4-modelList5”。没有modelList的产品将记录modelList为空。

请尝试此操作。 假设$json是原始数据,所以我在开始时对其进行了解码

$json = json_decode($json);

// Will use $csv to build our CSV content
$csv = array();

// Need to define the special column
$modelList = 'modelList';

// Find necessary additional column number for modelList
$maxSubData = 0;
foreach ($json as $id => $data)
{
    $maxSubData = max(array(count($data->modelList), $maxSubData ));
}

// Headers for CSV file
// Headers Start
$headers = array();
foreach ($json[0] as $key => $value)
{
    if ($key == $modelList)
    {
        for ($i = 1; $i <= $maxSubData; $i++)
        {
            $headers[] = $modelList . $i;
        }
    }
    else
    {
        $headers[] = $key;
    }
}
$csv[] = '"' . implode('","', $headers) . '"';
// Headers End

// Now the rows
// Rows Start
foreach ($json as $data)
{
    $fieldValues = array();
    foreach ($data as $key => $value )
    {
        if ($key == $modelList)
        {
            $j = 0;
            foreach ($value as $subValue)
            {
                $subData = array();
                foreach ($subValue as $subCols)
                {
                    $subData[] = $subCols;
                }
                $j++;
                $fieldValues[] = htmlspecialchars(implode(':', $subData ));
            }
            for ($i = $j + 1; $i <= $maxSubData; $i++)
            {
                $fieldValues[] = '';
            }
        }
        else
        {
            $fieldValues[] = htmlspecialchars($value);
        }
    }

    $csv[] = '"' . implode('","', $fieldValues) . '"';
}
// Rows End

$finalCSV = implode("\n", $csv);

print $finalCSV;
$json=json\u decode($json);
//将使用$csv构建我们的csv内容
$csv=array();
//需要定义特殊列
$modelList='modelList';
//查找modelList所需的附加列号
$maxSubData=0;
foreach($json作为$id=>$data)
{
$maxSubData=max(数组(计数($data->modelList),$maxSubData));
}
//CSV文件的标题
//标题开始
$headers=array();
foreach($json[0]作为$key=>$value)
{
如果($key==$modelList)
{
对于($i=1;$i$value)
{
如果($key==$modelList)
{
$j=0;
foreach($value作为$subValue)
{
$subData=array();
foreach($subValue作为$subCols)
{
$subData[]=$subCols;
}
$j++;
$fieldValues[]=htmlspecialchars(内爆(“:”,$subData));
}

对于($i=$j+1;$i这是不可能的,因为在JSON中您有分层数据结构,但CSV只是二维的(请参见modelList属性)。

使用内置函数将该JSON字符串转换为数组,然后对其进行迭代并输出所需内容。您希望如何输出modelList?对于我来说,它将是一个完整的字符串。”[{“键”:“SEH404”,“值”:“黑色”},{“键”:“SEH404W”,“值”:“白色”}]"您想对modelList数组做什么?如何在CSV中表示该数据?数组modelList的结果必须是每个值的一列示例:-名称列------packWidth、itemNo、groupItemNo、status、categoryId、packType、条形码、modelLabel、modelList1、modelList2、packQty、packInclude、id------value------200、SEH404、SEH404,124356,颜色盒,1234567890987,颜色,SEH404:黑色,SEH404W:白色,20,USB适配器,3456@user3406254:ModelList将始终包含两条记录,以便与:在modelList1和modelList2列中合并?一个产品ModelList可以工作,但如果json文件中有许多产品,第一个是无记录ModelList则无法工作。这是原始的json文件,我已经尝试过了,但是脚本工作不好,并且没有包装。发布的代码是初始问题的任何可能解决方案的最简化版本,它还扩展了初始问题,并包含了最初未提供的可能要求。它可以根据我的进一步要求进行调整在您的项目中。因此,我希望它提供了一个良好的起点,就像问题中提到的“与产品一起工作”。我希望它有帮助。您好,我感谢您提供了帮助。当然,这是一个伟大的脚本,我只需适应我的需要。谢谢阿加尼对不起,我可以问您最后一个问题吗?写价值观​​要在csv文件的最后一列中创建modelList,以避免数据混乱,可以吗?如果您希望我响应,请提前感谢。这是原始json文件,我已经尝试过了,但脚本工作不正常,无法包装。dropbox.com/s/37k18vq538x5gio/json.txt您可以使用迭代器并创建嵌套键来创建普通表对于csv头像,“谢谢”的否决票,但仍然-plain table是plain table。它不能完全覆盖json可以拥有的多层深层层次结构。