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

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

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

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

正規表現

正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

解決済

2回答

275閲覧

【PHP】 配列の中にある文字列の一部分を抽出し、新しい配列に格納したい

kotaosu

総合スコア15

PHP

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

正規表現

正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

1クリップ

投稿2018/02/09 03:20

編集2018/02/09 08:56

PHPについての質問です。
自分がやりたいことを以下に記述していますが、これを実現するにはどのようにコードを書いたらいいでしょうか。
もしかしたら、最初から最後までの間でいらない過程もあるかもしれないので、
その場合はその過程を省略してくれて問題ありません

配列
2017/1/1 00:00:00 東京 aaaaaaaaaaaaaaaa
2017/1/1 00:00:00 東京 aaaaaaaaaaaaaaaa
2017/1/1 00:00:00 東京 aaaaaaaaaaaaaaaa
2017/1/1 00:00:00 大阪 bbbbbbbbbbbbbbbb
2017/1/1 00:00:00 大阪 bbbbbbbbbbbbbbbb
2017/1/1 00:00:00 大阪 bbbbbbbbbbbbbbbb
2017/1/1 00:00:00 大阪 bbbbbbbbbbbbbbbb
2017/1/1 00:00:00 大阪 bbbbbbbbbbbbbbbb
2017/1/1 00:00:00 福岡 cccccccccccccccc
2017/1/1 00:00:00 福岡 cccccccccccccccc
2017/1/1 00:00:00 福岡 cccccccccccccccc
2017/1/1 00:00:00 福岡 cccccccccccccccc
2017/1/1 00:00:00 福岡 cccccccccccccccc

正規表現抽出し、文字列に直す
aaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaa
bbbbbbbbbbbbbbbb
bbbbbbbbbbbbbbbb
bbbbbbbbbbbbbbbb
bbbbbbbbbbbbbbbb
bbbbbbbbbbbbbbbb
cccccccccccccccc
cccccccccccccccc
cccccccccccccccc
cccccccccccccccc
cccccccccccccccc

重複を削除
aaaaaaaaaaaaaaaa
bbbbbbbbbbbbbbbb
cccccccccccccccc

新しい配列に格納
"sample1" => "aaaaaaaaaaaaaaaa"
"sample2" => "bbbbbbbbbbbbbbbb"
"sample3" => "cccccccccccccccc"

以上、よろしくお願い致します。

<<追記>>
頂いたコードをもとにphpを実行してみたのですが、配列の中身がありませんでした。
array[0]で空っぽでした。
もしかしたら正規表現が上手くいっていないのかもしれません。
ログファイルをアップロードして配列に格納したものをもう少し詳細に以下に記述しました。
もしさきほどいただいた正規表現を変更する必要がない場合は、こちらが書いたコードでどこかに
ミスがあるのかもしれません。

php

1array(393) { 2 [0]=> 3 string(128) "2017/01/01 10:05:36 東京 TEST_TEST_TEST_TEST_TEST type=0 code=****.****.**** aaaaaaaaaaaaaaaaaaaaaaaaaaaaa" 4 [1]=> 5 string(128) "2017/01/01 10:05:36 東京 TEST_TEST_TEST_TEST_TEST type=0 code=****.****.**** aaaaaaaaaaaaaaaaaaaaaaaaaaaaa" 6 [2]=> 7 string(128) "2017/01/01 10:05:36 大阪 TEST_TEST_TEST_TEST_TEST type=0 code=****.****.**** bbbbbbbbbbbbbbbbbbbbbbbbbbbbb" 8 [3]=> 9 string(128) "2017/01/01 10:05:36 大阪 TEST_TEST_TEST_TEST_TEST type=0 code=****.****.**** bbbbbbbbbbbbbbbbbbbbbbbbbbbbb" 10 [4]=> 11 string(128) "2017/01/01 10:05:36 大阪 TEST_TEST_TEST_TEST_TEST type=0 code=****.****.**** bbbbbbbbbbbbbbbbbbbbbbbbbbbbb" 12. 13. 14. 15 [392]=> 16 string(128) "2017/01/01 10:05:36 東京 TEST_TEST_TEST_TEST_TEST type=0 code=****.****.**** aaaaaaaaaaaaaaaaaaaaaaaaaaaaa" 17}

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

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

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

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

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

guest

回答2

0

ベストアンサー

2017/1/1 00:00:00 東京 aaaaaaaaaaaaaaaa

はこれでひとつなぎのデータなのでしょうか?
それとも「"2017/1/1 00:00:00","東京","aaaaaaaaaaaaaaaa"」のように
別れているのでしょうか?

地名のあとのスペースが全角ですが、抽出は全角のあとの文字全部でよいのでしょうか?

PHP

1$a=[ 2"2017/1/1 00:00:00 東京 aaaaaaaaaaaaaaaa", 3"2017/1/1 00:00:00 東京 aaaaaaaaaaaaaaaa", 4"2017/1/1 00:00:00 東京 aaaaaaaaaaaaaaaa", 5"2017/1/1 00:00:00 大阪 bbbbbbbbbbbbbbbb", 6"2017/1/1 00:00:00 大阪 bbbbbbbbbbbbbbbb", 7"2017/1/1 00:00:00 大阪 bbbbbbbbbbbbbbbb", 8"2017/1/1 00:00:00 大阪 bbbbbbbbbbbbbbbb", 9"2017/1/1 00:00:00 大阪 bbbbbbbbbbbbbbbb", 10"2017/1/1 00:00:00 福岡 cccccccccccccccc", 11"2017/1/1 00:00:00 福岡 cccccccccccccccc", 12"2017/1/1 00:00:00 福岡 cccccccccccccccc", 13"2017/1/1 00:00:00 福岡 cccccccccccccccc", 14"2017/1/1 00:00:00 福岡 cccccccccccccccc", 15 ]; 16$b=[]; 17array_walk($a,function($x) use(&$b){ 18 $pattern="/(?<=\s)\S+$/"; 19 if(preg_match($pattern,$x,$match)){ 20 $b[]=$match[0]; 21 } 22}); 23$b=array_unique($b); 24print_r($b);

こうした上で、キーを「sample○○」にする根拠があれば提示下さい

追記

もしかしたら、元データは配列じゃなくて文字列ってことですか?

PHP

1$a=<<<eof 22017/1/1 00:00:00 東京 aaaaaaaaaaaaaaaa 32017/1/1 00:00:00 東京 aaaaaaaaaaaaaaaa 42017/1/1 00:00:00 東京 aaaaaaaaaaaaaaaa 52017/1/1 00:00:00 大阪 bbbbbbbbbbbbbbbb 62017/1/1 00:00:00 大阪 bbbbbbbbbbbbbbbb 72017/1/1 00:00:00 大阪 bbbbbbbbbbbbbbbb 82017/1/1 00:00:00 大阪 bbbbbbbbbbbbbbbb 92017/1/1 00:00:00 大阪 bbbbbbbbbbbbbbbb 102017/1/1 00:00:00 福岡 cccccccccccccccc 112017/1/1 00:00:00 福岡 cccccccccccccccc 122017/1/1 00:00:00 福岡 cccccccccccccccc 132017/1/1 00:00:00 福岡 cccccccccccccccc 142017/1/1 00:00:00 福岡 cccccccccccccccc 15eof; 16 17$pattern="/(?<= ).+$/m"; 18preg_match_all($pattern,$a,$match); 19$b=array_unique($match[0]); 20print_r($b);

修正

最初の例示はセパレータに全角スペースがはいっていましたが
追記いただいたソースでは半角スペースになってますね
それではヒットしません、空白文字を利用していいならこうなります

PHP

1<?PHP 2$a=[ 3 "2017/01/01 10:05:36 東京 TEST_TEST_TEST_TEST_TEST type=0 code=**.**.** aaaaaaaaaaaaaaaaaaaaaaaaaaaaa", 4 "2017/01/01 10:05:36 東京 TEST_TEST_TEST_TEST_TEST type=0 code=**.**.** aaaaaaaaaaaaaaaaaaaaaaaaaaaaa", 5 "2017/01/01 10:05:36 大阪 TEST_TEST_TEST_TEST_TEST type=0 code=**.**.** bbbbbbbbbbbbbbbbbbbbbbbbbbbbb", 6 "2017/01/01 10:05:36 大阪 TEST_TEST_TEST_TEST_TEST type=0 code=**.**.** bbbbbbbbbbbbbbbbbbbbbbbbbbbbb", 7 "2017/01/01 10:05:36 大阪 TEST_TEST_TEST_TEST_TEST type=0 code=**.**.** bbbbbbbbbbbbbbbbbbbbbbbbbbbbb", 8 "2017/01/01 10:05:36 東京 TEST_TEST_TEST_TEST_TEST type=0 code=**.**.** aaaaaaaaaaaaaaaaaaaaaaaaaaaaa", 9 ]; 10$b=[]; 11array_walk($a,function($x) use(&$b){ 12 $pattern="/(?<=\s)\S+$/"; 13 if(preg_match($pattern,$x,$match)){ 14 $b[]=$match[0]; 15 } 16}); 17$b=array_unique($b); 18print_r($b);

投稿2018/02/09 03:30

編集2018/02/09 08:57
yambejp

総合スコア114839

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

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

kotaosu

2018/02/09 03:38

速やかな回答ありがとうございます。>< 質問にお答えさせていただきます。 2017/1/1 00:00:00 東京 aaaaaaaaaaaaaaaa はこれでひとつなぎのデータなのでしょうか? >>はい。ひとつつなぎです。 地名のあとのスペースが全角ですが、抽出は全角のあとの文字全部でよいのでしょうか? >>はい。ただダブルコーテーションは含めたくありません。 こうした上で、キーを「sample○○」にする根拠があれば提示下さい >>これは見やすくするために自分が勝手につけたものなので、気にしていただかなくて大丈夫です。
yambejp

2018/02/09 03:41

というと、私の例示と条件があうと思うのですが どこか条件的にちがうようなら指摘下さい
kotaosu

2018/02/09 06:20

追記への返答 >>もともとはlogファイルでございます。 logファイルをアップロードし、フォームを使ってphpに送信し、配列に格納しているので、文字列ではないはずです。
yambejp

2018/02/09 06:51

いずれにしても今ご提示の情報からはすでに回答したとおりの もの以上は書きようがありません。 具体的にやってみて、うまくいくのかいかないのか? うまくいかないなら、どういう状態(エラー、表示されない、想定外の表示?) なのかなど詳細な追加情報を提示して下さい
kotaosu

2018/02/09 09:02

あなたは天才!! 無事解決できました! 長い時間をいただきありがとうございました!!
guest

0

phpなど不要。そう、シェル芸ならね!

bash

1$ cat log 22017/1/1 00:00:00 東京 aaaaaaaaaaaaaaaa 32017/1/1 00:00:00 東京 aaaaaaaaaaaaaaaa 42017/1/1 00:00:00 東京 aaaaaaaaaaaaaaaa 52017/1/1 00:00:00 大阪 bbbbbbbbbbbbbbbb 62017/1/1 00:00:00 大阪 bbbbbbbbbbbbbbbb 72017/1/1 00:00:00 大阪 bbbbbbbbbbbbbbbb 82017/1/1 00:00:00 大阪 bbbbbbbbbbbbbbbb 92017/1/1 00:00:00 大阪 bbbbbbbbbbbbbbbb 102017/1/1 00:00:00 福岡 cccccccccccccccc 112017/1/1 00:00:00 福岡 cccccccccccccccc 122017/1/1 00:00:00 福岡 cccccccccccccccc 132017/1/1 00:00:00 福岡 cccccccccccccccc 142017/1/1 00:00:00 福岡 cccccccccccccccc 15 16$ cat log|awk -F' ' '$0=$2'|sort -u 17aaaaaaaaaaaaaaaa 18bbbbbbbbbbbbbbbb 19cccccccccccccccc

投稿2018/02/09 08:24

hichon

総合スコア5737

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

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

kotaosu

2018/02/09 08:38

ご回答ありがとうございます。 なるほど。シェルスクリプトにして実行してしまうって方法もあるんですね。 このやり方の場合は、1度シェルスクリプトファイルを作成してそこにデータを格納して、 実行するということでしょうか。 logデータをアップロードしたとき、自動で aaaaaaaaaaaaaaaa bbbbbbbbbbbbbbbb cccccccccccccccc を振り分けられるようにしたいのです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問