【问题标题】:PHP: Output a complicated json to csvPHP:将复杂的 json 输出到 csv
【发布时间】:2019-02-05 13:56:08
【问题描述】:

我正在寻找一种解决方案来呈现这样的 json 字符串:

 {"result_count":5,"total_count":"1102","next_offset":5,"entry_list":[{"id":"00003010000000","module_name":"Contacts","name_value_list":{"id":{"name":"id","value":"00003010000000"},"name":{"name":"name","value":"Undefiniert"},"phone_work":{"name":"phone_work","value":""},"phone_mobile":{"name":"phone_mobile","value":"01"}}},{"id":"00003015000003","module_name":"Contacts","name_value_list":{"id":{"name":"id","value":"00003015000003"},"name":{"name":"name","value":"Christian X"},"phone_work":{"name":"phone_work","value":""},"phone_mobile":{"name":"phone_mobile","value":"0043 699 23231"}}},{"id":"00003015000005","module_name":"Contacts","name_value_list":{"id":{"name":"id","value":"00003015000005"},"name":{"name":"name","value":"Mario X"},"phone_work":{"name":"phone_work","value":"0043 1 232 151"},"phone_mobile":{"name":"phone_mobile","value":"0043 699 1112"}}},{"id":"00003015000006","module_name":"Contacts","name_value_list":{"id":{"name":"id","value":"00003015000006"},"name":{"name":"name","value":"Renate X"},"phone_work":{"name":"phone_work","value":"0043 1232 133"},"phone_mobile":{"name":"phone_mobile","value":""}}},{"id":"00003015000007","module_name":"Contacts","name_value_list":{"id":{"name":"id","value":"00003015000007"},"name":{"name":"name","value":"Harald KrX"},"phone_work":{"name":"phone_work","value":"0043 232 150"},"phone_mobile":{"name":"phone_mobile","value":"00423"}}}],"relationship_list":[{"link_list":[{"name":"accounts","records":[{"link_value":{"name":{"name":"name","value":"(X) X"}}}]}]},{"link_list":[{"name":"accounts","records":[{"link_value":{"name":{"name":"name","value":"(Y) Y"}}}]}]},{"link_list":[{"name":"accounts","records":[{"link_value":{"name":{"name":"name","value":"(C) C"}}}]}]},{"link_list":[{"name":"accounts","records":[{"link_value":{"name":{"name":"name","value":"(D) D"}}}]}]},{"link_list":[{"name":"accounts","records":[{"link_value":{"name":{"name":"name","value":"(E) E"}}}]}]}]}

放入结果内容所在的 CSV 文件中

"ID","NAME","PHONE_WORK","PHONE_MOBILE","COMPANY"

所以在这个示例中:

"00003015000003","Christian X","","0043 699 23231","X"<br/>
....<br/>
...

我想这很复杂......但也许有人可以在这里帮助我。

【问题讨论】:

  • I guess this is quite complicated 当您知道自己在做什么时,没有什么是真正复杂的,但是您需要表现出最小的努力并尝试自己,然后告诉我们您做了什么来回答您自己的问题。我们帮助调试,而不是为您完成所有工作:-) 看看什么和How to Ask。做一些研究,搜索关于SO的相关主题;如果您遇到困难,请发布您的尝试Minimal, Complete, and Verifiable example,并注明输入和预期输出。
  • 使用 json_decode($json, true) 将你的 json 转换为数组,然后遍历数组["entry_list"];
  • @IslamElshobokshy 你是对的。但我尝试了很多小时(而且我离真正的编码员还差得很远)所以我失败了——我很高兴有人发布了一个有效的代码示例,我永远无法自己编写它。但我现在可以使用该示例来完成我的工作:) 谢谢大家!

标签: php json csv output


【解决方案1】:

这是你想要的,带有公司名称:

$array = json_decode($JSON,true);

/*get companies name*/
$companies = array_map(function($arr){
  array_walk_recursive($arr,function($a,$key) use (&$return) { return $return[$key] = $a;});
  return preg_replace('/\(\w\) /','', $return['value']);
},$array['relationship_list']);

/*get employees details*/
$array = array_column($array['entry_list'],'name_value_list');

$headers = array_map('strtoupper',array_merge(array_keys($array[0]),['company']));

$out = fopen('file.csv','w');
fputcsv($out,$headers);

foreach($array as $key => $info){
  fputcsv($out, array_merge(array_column($info,'value'),[$companies[$key]]));
}
fclose($out);

【讨论】:

  • 哇!这正是我正在寻找的东西......它就像我认为使用 array_map 一样“复杂”......我猜我的编码技能不足以自己编码......所以我感谢你你的时间得到这个!
  • 我在尝试代码示例时认识到的一件事是,有时它会在字段数据周围添加“,有时则不会……是否可以始终添加“”作为周围字符现场数据?
  • @xanthos84 代码示例缺少引号有时是因为fputcsv() 仅在某些条件下用引号将字段括起来read this,而this 就是您要查找的内容。
【解决方案2】:

没那么难:

<?php

$json = '....';
$data = json_decode($json);

# print_r($data); #de-comment to debug

# print title
fputcsv(STDOUT,array("ID","NAME","PHONE_WORK","PHONE_MOBILE","COMPANY"));

foreach ( $data->entry_list as &$rec )
{
    $val = &$rec->name_value_list;
    fputcsv(STDOUT,array( $val->id->value,
                          $val->name->value,
                          $val->phone_work->value,
                          $val->phone_mobile->value ));
    # no data available for COMPANY!
}
?>

【讨论】:

  • 为什么是&amp;$rec 而不仅仅是$rec
  • 如果我不更改数据,一般决定使用参考而不是副本。在这种情况下,它是不需要的,因为对象总是被引用。因此,将其视为提示“此处不需要复制”。
  • 多年前,引用显然比数组副本快。今天的快速测试找不到任何时间优势。似乎,现在更好地实现了写时复制。
  • 谢谢,这不是那么复杂 - 真的,因为公司不见了......困难的部分是让公司进入它(因为它在 json 中!)......很高兴上面的用户您的帖子,发布了包括公司在内的代码! :) 无论如何感谢您的时间和代码示例!
猜你喜欢
  • 2021-02-21
  • 2020-04-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多