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

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

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

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

Q&A

解決済

1回答

593閲覧

PHP 正規表現の練習

d__..___

総合スコア18

PHP

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

0グッド

0クリップ

投稿2020/04/20 11:56

次のような時間割のデーターがあるとします。
これを連想配列に直したいです。
どのようにすればよいでしょうか。

生徒の名前(改行)曜日コマ数 授業開始時間-授業終了時間
が繰り返されていて、これを扱いやすいように配列に直したいです。

今回は$dataという文字列にこのような情報が格納されているとします

PHP

1$data = <<< HTML 2山田君 3 4月曜日3コマ 509:00 10:00 611:00 12:00 713:30 14:30 8 9火曜日1コマ 1013:00 14:00 11 12水曜日2コマ 1316:00 17:30 1417:30 18:55 15HTML;

ほしい配列
授業の時間だけ抜き出した連想配列

PHP

1$array_data = array( 2array('09:00' => '10:00','11:00' => '12:00','13:00' => '14:00'), 3array('13:00' => '14:00'), 4array('16:00' => '17:30','17:30' => '18:55') 5); 6

以下私の考えたコード

PHP

1$data = <<< HTML 2山田君 3 4月曜日3コマ 509:00 10:00 611:00 12:00 713:30 14:30 8 9火曜日1コマ 1013:00 14:00 11 12水曜日2コマ 1316:00 17:30 1417:30 18:55 15HTML; 16 17 18preg_match("/\d{2}\:\d{2} \d{2}\:\d{2}/s",$data,$match); 19var_dump($match); 20 21$array_data = $match; 22

どうすれば$dataから$data_arrayを抽出できますか?

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2020/04/20 12:05

どこかのスクールの課題でしょうか?
hayato7

2020/04/20 13:59

連想配列より、二次元配列の方がよいのでは。
kai0310

2020/04/20 14:01

>どうすれば$dataから$data_arrayを抽出できますか? 申し訳ありませんが、疑問点がわかりません。 代入前にvar_dumpするのではなく、代入後にすればよいのではないでしょうか?
d__..___

2020/04/20 14:06

$data_arrayが正規表現を間違えているためこのままだと空です。 preg_match("/\d{2}\:\d{2} \d{2}\:\d{2}/s",$data,$match); この正規表現の部分を教えてください。どのようにかけばいいですか?
guest

回答1

0

ベストアンサー

$array_data が「日付別」に時間だけを抜き出した配列になっているので、一度日付別に抽出したあとで再度時間を抽出する必要があるかと思います。

下記で一応は抽出できそうです。

php

1<?php 2$data = <<< HTML 3山田君 4 5月曜日3コマ 609:00 10:00 711:00 12:00 813:30 14:30 9 10火曜日1コマ 1113:00 14:00 12 13水曜日2コマ 1416:00 17:30 1517:30 18:55 16HTML; 17 18 19$array_data = array(); 20preg_match_all("/(コマ\s+((\d{2}\:\d{2} \d{2}\:\d{2})\s*)+)\s*?/s", $data, $matches); 21foreach ($matches[1] as $match) { 22 $array_data2 = array(); 23 preg_match_all('/(\d{2}:\d{2}) (\d{2}:\d{2})/', $match, $lines, PREG_SET_ORDER); 24 foreach ($lines as $line) { 25 $array_data2[$line[1]] = $line[2]; 26 } 27 $array_data[] = $array_data2; 28} 29print_r($array_data); 30 31 32--- 33Array 34( 35 [0] => Array 36 ( 37 [09:00] => 10:00 38 [11:00] => 12:00 39 [13:30] => 14:30 40 ) 41 42 [1] => Array 43 ( 44 [13:00] => 14:00 45 ) 46 47 [2] => Array 48 ( 49 [16:00] => 17:30 50 [17:30] => 18:55 51 ) 52 53)

投稿2020/04/20 15:21

Eggpan

総合スコア3205

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問