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

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

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

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

Q&A

解決済

4回答

21598閲覧

phpでタブ区切りテキストファイルを1行目をキーの連想配列にしたい

退会済みユーザー

退会済みユーザー

総合スコア0

PHP

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

0グッド

2クリップ

投稿2015/06/11 01:49

編集2015/06/11 03:39

下記のようなタブ区切りのテキストファイルを
1行目だけをキーにした連想配列にしたいのですが
良い方法はありますでしょうか?

lang

1record.txt(実際のファイルは50列くらいあります。) 2 3id cate_cd name price (←連想配列のkeyに) 456 69 シャンプー 1690 (←連想配列のvalueに) 51136 63 トリートメント 7000 6

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

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

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

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

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

guest

回答4

0

上記ですが、PHP5.3以降split関数の利用は適応されなくなりました。
参考記事:http://php.net/manual/ja/function.split.php

その為現在では、explode関数などを使用するのが一般的です。
PHPは、バージョンにより利用できる関数が異なるので常に最新の情報を参照するように心がけて下さい。

<?php $strbuf = explode("\t", $str); var_dump($strbuf); exit; ?>

下記は、サンプルですがrecord.txtのファイル読み込みを行う時点で利用する関数がこのなるかと思います。

参考記事:http://php.net/manual/ja/function.fgetcsv.php

<?php $filepath = './record.txt'; $records = array(); if (($handle = fopen($filepath, "r")) !== false) { while (($line = fgetcsv($handle, 1000, "\t")) !== false) { $records[] = $line; } fclose($handle); } // 一行目のみ表示 var_dump($records[0]); // 不要データなのでデータ破棄 $records = array(); exit; ?>

投稿2015/06/11 05:51

編集2015/06/11 06:00
takayukiinaba

総合スコア1158

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

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

退会済みユーザー

退会済みユーザー

2015/06/11 06:50

>takayukiinabaさん ありがとうございます。正規表現を使わない場合はexplodeのほうが高速というのは見つけたとこだったんですが、splitはもう非推奨なのですね。
guest

0

ベストアンサー

結局このような形になりました。

lang

1 $buf = file_get_contents($filepath); 2 $lines = explode("\r\n", $buf); 3 $lines = array_filter($lines, 'strlen'); //空行を除去 4 5 $title = array(); 6 $records = array(); 7 $data = array(); 8 9 foreach ($lines as $key => $line ) { 10 if($key == 0){ 11 $title = explode("\t",$line); 12 }else{ 13 $records[$key] = explode("\t",$line); 14 $data[] =array_combine($title, $records[$key]); 15 } 16 } 17 var_dump($data);

回答頂いた皆様ありがとうございました!

投稿2015/06/11 09:09

編集2015/06/15 02:09
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

0

最初にキーだけ取ってarray_combineするのはどうでしょうか?
また、tsvの読み込みはfgetcsvでも良いかもしれません。

lang

1$data = array(); 2 3if (($fp = fopen('test.tsv', 'r')) !== false) { 4 $key = fgetcsv($fp, 0, "\t"); 5 $keySize = count($key); 6 7 while (!feof($fp)) { 8 $value = fgetcsv($fp, 0, "\t"); 9 if (count($value) == $keySize) { 10 $data[] = array_combine($key, $value); 11 } 12 } 13 fclose($fp); 14} 15 16var_dump($data);

投稿2015/06/11 06:02

gtakat

総合スコア206

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

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

退会済みユーザー

退会済みユーザー

2015/06/11 06:53

>gtakatさん ありがとうございます。array_combineの使用検討してたんですが、うまくいってなかったので助かりました。出力内容も一番求める形に近かったのでベストアンサーにさせて頂きました。
退会済みユーザー

退会済みユーザー

2015/06/11 07:11

fgetcsvを使うと日本語が消えてしまいますね。。 申し訳ありません、解決済みになってしまうので一度ベストアンサー外させて頂きます。
gtakat

2015/06/11 09:10

ソースコードとtsvの文字コードが合っていないということはないでしょうか? もしそうであれば途中に文字コード変換を挟むとうまくいくかもしれません。 // 例)ソースがUTF-8、tsvがsjisの場合 $value = fgetcsv($fp, 0, "\t"); $value = mb_convert_encoding($value, 'utf-8', 'sjis');
guest

0

タブ区切りの配列が取得できます。
$strbuf = split("\t", $str);
$array = array( $strbuf[0] => $strbuf[$i4], $strbuf[1] => $srbuf[$i4+1], ...
て感じですかね

投稿2015/06/11 02:36

MasaakiIrie

総合スコア1021

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

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

退会済みユーザー

退会済みユーザー

2015/06/11 02:59

ありがとうございます。split 使えそうですね。 テーブルわかりやすく書いたのですが実は列が50以上あるテーブルなので、もう少しスマートなやり方あれば助かります^^;
MasaakiIrie

2015/06/11 05:09

$hoge = array( $strbuf[$x]=>$strbuf[$y*50+$x]); $hoge_list = array_merge($hoge); ですかね。
退会済みユーザー

退会済みユーザー

2015/06/11 06:51

>MasaakiIrieさん ありがとうございます。参考にさせて頂きます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問