- 締切済み
ほしいデータの文字列の抽出がわかりません・・・
たびたび質問して申し訳ありません・・・ PHPであるファイル(jyusho.txt)内容を読み込むとします。 ファイル内容は名前、住所、生年月日、出身地となります。 ---------------------------------------------------------------- 北島三郎△"東京都八王子市山奥1丁目"△19000101△アメリカ 五木ひろし△"広島県尾道市坂上5丁目△五木ビル△1101号室"△19000101△広島 かんだうの△"東京都渋谷区代官山1丁目△デリシャスビル101"△19000101△東京 <省略> 北島三郎△"東京都八王子市山奥1丁目"△19000101△アメリカ <省略> バリー・ボンズ△"東京都武蔵村山4丁目△都営ビル201号室"△富山 --------------------------------------------------------------- 上記のようなデータ(レコード)がテキストファイルに入っているとします。 このデータを連想配列に格納しようと考えています。 それぞれ、名前、住所、生年月日、出身地を格納したいのですが、 それぞれのデータの間は△(半角スペース)で区切ってあります。 住所は""で囲まれた情報が住所ですが、住所の中には △(半角スペース)が格納されていますが、これはデータの区切りでは ありません。 また上記の場合は、さぶちゃんが2回でてきました。 こういう風に同じデータが複数でた場合は、 すべての情報(名前、住所、生年月日、出身地のデータ)がすべて合致した 場合は連想配列には格納しないことにしたいです。 このような情報を連想配列に格納する場合、 どのようにすればいいのでしょう? 色々考えたのですが思いつきません。 住所の△(半角スペース)がなければ・・・・ ながなが書いてしまいましたが、どうかよろしくお願いいたします。
- みんなの回答 (4)
- 専門家の回答
みんなの回答
- kusukusu
- ベストアンサー率38% (141/363)
> array_unique($data)と実行すると($dataは今回のレコードをexplodeなど > で分割した、氏名、住所、・・が格納されている連想配列)・・・ > 『重複データのさぶちゃん』のみが格納されています。 ごめんなさい(^^;勘違いで。 #No1で言えば、file()で開いた後です。 $fileopen=file("jusho.txt"); $fileopen=array_unique($fileopen);
- kusukusu
- ベストアンサー率38% (141/363)
> おそらく△(半角スペース)で、explode(" ", "レコード")と その通りです(^^;たいぽです。 > explode(" ", "レコード")とすると > かんだうのの誕生日がデリシャスビル101"となってしまいます。 なるほど。。ちょっと遠回りしないといけませんねぇ… 住所は、"住所"って形ですよね? explode()で切った後に、 if(ereg("\\",$brithday)) { } とやって、文字列を再評価すればいいと思います。 (もし誕生日に「"」を含めば…)
- kusukusu
- ベストアンサー率38% (141/363)
> また上記の場合は、さぶちゃんが2回でてきました。 > こういう風に同じデータが複数でた場合は、すべての情 > 報(名前、住所、生年月日、出身地のデータ)がすべて > 合致した場合は連想配列には格納しないことにしたいです。 一つ忘れていました(^^; これはlistの途中でも、一旦整形が終わって格納し終わった後でも、どちらでやってもいいですね。 たぶん整形が終わった後にarray_unique()でやった方が楽ですよ。 uniqu
お礼
下記の確認処理なんですが、 explode関数は指定文字列の前にパラメータが 省略不可となります。 おそらく△(半角スペース)で、explode(" ", "レコード")と お書きになりなかったのだと思いますが、 explode(" ", "レコード")とすると かんだうのの誕生日がデリシャスビル101"となってしまいます。
- kusukusu
- ベストアンサー率38% (141/363)
今日はこれと似たような、コードを2回書いたので、 ( http://odn.okweb.ne.jp/kotaeru.php3?q=431275 http://odn.okweb.ne.jp/kotaeru.php3?q=431398 ) 今回は、ロジックだけにします(笑) それともう一つ、 > 色々考えたのですが思いつきません。 こんな事を書くのはあまりいいともいませんよ。 「一体何を考えたんだ?それを書いてみろ」って思います。 正直私の場合、これがなかったら実際のコードまで書こうかと思っていました。 で、本題に まずfile()関数でレコード毎に配列に取り込みます。 そして、レコード毎にlist()とexplode()等を使って、それぞれの項目に分けていきます。 例: list($name,$address,$birthday,$home)=explode("レコード"); これでOKだと思いますよ。
お礼
ありがとうございました。 >「一体何を考えたんだ?それを書いてみろ」って思います。 確かにそうですね。 どう考えたとか、どういうエラーがでないとか書かないといけませんね。 失礼しました。 上記のロジックは今から確認しますが、 取り急ぎ、反省です。 確認後、また報告します。ありがとうございました。
お礼
再び返信ありがとうございます。 先ほどのご指摘のようにarray_unique関数を使用してみました。 色々なサイトで検索したところ、 array_unique($data)と実行すると($dataは今回のレコードをexplodeなど で分割した、氏名、住所、・・が格納されている連想配列)・・・ 『重複データのさぶちゃん』のみが格納されています。 array_uniqueだとさぶちゃんの重複データは削除するのでは なのでさぶちゃんデータ、五木ひろしデータ、・・・バリーボンズデータが 取得できるとおもってました。 上記のようになるのは僕の書き方がわるいんでしょうか? $data = array_unique($data);としています。 もしかして $data2 = array_unique($data);として $dataと$data2の連想配列のディフをとらないといけないのでしょうか? よろしくお願いいたします。