質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

2回答

1893閲覧

PHPでjson形式のファイルをCSVにしたいんですがarrayと表示される部分があります

greentail

総合スコア15

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2022/04/27 02:18

編集2022/04/27 02:30

下記のようなコードでjson形式のファイルをCSVにしたいんですがtest.csvをエクセルで開くとrangeの部分がarrayと表示されてしまいます。

25,山田,1984-07-23,O,サッカー,千葉,array

foreachの中に、
if($key == "range"){
$recordValue = $data["result"]["emplo"]["range"];
}
のように記述して試しているのですが行き詰ってしまいました。

25,山田,1984-07-23,O,サッカー,千葉,2002-04-01,2019-07-02

のように出力したいと思っています。
ご教示お願いします。

json.json

1{ 2 "result": { 3 "emplo": [ 4 { 5 "id": "25", 6 "name": "山田", 7 "birthday": "1984-07-23", 8 "blood": "O", 9 "hobby": "サッカー", 10 "pref": "千葉", 11 "range": { 12 "from": "2002-04-01", 13 "to": "2019-07-02" 14 } 15 }, 16 { 17 "id": "30", 18 "name": "田中", 19 "birthday": "1990-10-21", 20 "blood": "A", 21 "hobby": "DIY", 22 "pref": "栃木", 23 "range": { 24 "from": "2011-05-01", 25 "to": "2019-07-30" 26 } 27 } 28 ] 29 } 30}

php

1<?php 2$str = file_get_contents("json.json"); 3$data = json_decode($str, true); 4 5$filew = fopen('C:\xxxx\xxxxx\test.csv', 'w'); 6 7foreach ($data["result"]["emplo"] as $key => $recordValue) { 8 $recordValue = mb_convert_encoding($recordValue, "SJIS", "UTF-8"); 9 fputcsv($filew, $recordValue); 10 11} 12 13// ファイルを閉じる 14fclose($filew);

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2022/04/27 02:27

>if($key == "range"){ 処理  } 「処理」を具体的に記載してください。
greentail

2022/04/27 02:31

すみません、修正しました
退会済みユーザー

退会済みユーザー

2022/04/27 02:32

> test.csvをエクセルで開くとrangeの部分がarrayと表示されてしまいます その「rangeの部分がarrayと表示」される CSV はどのようになっているのですか?
greentail

2022/04/27 02:36

答えになっているかわかりませんが、test.csvをエクセルで開いたときに該当のセルがArrayと表示されていて、エディタで開いてもArrayになっています。
退会済みユーザー

退会済みユーザー

2022/04/27 02:42

> エディタで開いてもArrayになっています。 そのエディタというのは何だかわかりませんが、メモ帳ですか? であれば、メモ帳に表示された結果を 2 ~ 3 行コピペしていただけると、その Array というのが何だか分かると思うのですが・・・
greentail

2022/04/27 02:58

メモ帳で開くと 25,山田,1984-07-23,O,サッカー,千葉,Array 30,田中,1990-10-21,A,DIY,栃木,Array となっています。
m.ts10806

2022/04/27 03:05

文字列として書き込まれた(もしくは出力された)ArrayはArrayという文字列にしかならないので、そこを追究してもあまり意味なさそうに思います。 要は配列を正しく展開できてないだけなので。
greentail

2022/04/27 03:11

ありがとうございます。 tabuu様がご教示下さいました一時的に移し替えるやり方で実現することが出来ました。
guest

回答2

0

ベストアンサー

こんな感じでいかがでしょうか?

PHP

1foreach ($data["result"]["emplo"] as $key => $recordValue) { 2 ... 3 $recordValue['range_from'] = $recordValue['range']['from']; 4 $recordValue['range_to'] = $recordValue['range']['to']; 5 unset($recordValue['range']); 6 ... 7}

投稿2022/04/27 02:40

tabuu

総合スコア2449

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

greentail

2022/04/27 03:07

ありがとうございます。 ご教示頂きました方法で 25,山田,1984-07-23,O,サッカー,千葉,2002-04-01,2019-07-02 と表示されました。
guest

0

$recordValue = $data["result"]["emplo"]["range"];

そもそもそのrange自体も連想配列ですので上記ではforeachで回ってきている$recordValueを直接参照するのと変わらないですし、emploの何番目か が明示されてないので無効な指定です。
どのように出力されてほしいのかわかりませんが、ひとまず下記のようにしてみてください。

PHP

1if($key == "range"){ 2 $recordValue = $recordValue["from"].$recordValue["to"]; 3}

もしくは下記でも同じはず。

PHP

1if($key == "range"){ 2 $recordValue = implode("",$recordValue); 3}

投稿2022/04/27 02:45

m.ts10806

総合スコア80850

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

greentail

2022/04/27 03:06

ありがとうございます。しかし fputcsv() expects parameter 2 to be array, string given と表示されます。
m.ts10806

2022/04/27 03:16

あぁ、そういうことか。 StringにしたからArrayを求めるfputcsvにあわなくなったんですね。 それなら、fromとtoそれぞれ取得して別配列にするしかなさそうです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問