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

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

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

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

Q&A

2回答

1738閲覧

一行ずつ取得し計算

退会済みユーザー

退会済みユーザー

総合スコア0

PHP

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

0グッド

0クリップ

投稿2015/10/25 08:44

編集2015/10/25 11:17

昨日同じ内容のものを投稿しましたが、出来ませんでした。。。

テキストエリアに入力された値を取得し、一行ずつ処理をしたいです。

以下の配列はテキストエリアに入力された値を一行ずつ改行区切りで配列に格納したものになります。
入力される形式は変わりませんが、中の値は変わってきます。先頭の数字が317ではなく、200などの値がくるときもあります。
#以下も文字列扱いです。

PHP

1Array 2( 3 [0] => 317#118#1490#220#0 4 [1] => 317#220##7000#355##0 5 [2] => 317#355##10000#510##0 6 [3] => 317#510##10000#645##3500 7 [4] => 317###### 8)

最終結果としては、以下の形にしたいと考えています。
//出力結果
317#0#7365#527#0

このように出力したいです。

317#0#7365#527#0を例にとってご説明します。

初めの317は配列の0~4番目まで来ている317をそのまま表示をする形です。

#527は、0~4番目の配列の初めの#の後に来ている数字(118,220,355,510)を足したものから、3番目の#の後に来ている数字(220,355,510,645)を足したものを引いています。

#7365は、少し複雑で、2番目の#の後に来ている数字(1490,7000,10000,10000)を足したものから、最後の#の後に来ている数字(0,0,0,3500)を足したものを引くのですが、

//#1490 #1つだった場合は、1490*4をしたものを足す
//##7000 #2つがあった場合は、そのまま足す

//#0 #1つだった場合は、0*4をしたものを足す
//##0 #2つがあった場合は、そのまま足す

最後の317######は無視という形になります。

PHP

1$rotation = 0; 2$rotation_end = 0; 3$start_money = 0; 4$end_money = 0; 5$rotation2 = 0; 6$rotation2_end = 0; 7$balls = 0; 8$balls_end = 0; 9$number = 0; 10foreach($data_array as $value) { 11 if(preg_match('/\#{3}/',$value)) { 12 $valueArray = explode('#', $value); 13 $number += $valueArray[0]; 14 unset($value); 15 } 16 if(preg_match('/\#{2}/', $value)) { 17 $value = str_replace("##", "#", $value); 18 $valueArray = explode('#', $value); 19 $rotation += $valueArray[1]; 20 $rotation_end += $valueArray[3]; 21 $start_money += $valueArray[2]; 22 $end_money += $valueArray[4]; 23 } 24 else{ 25 $valueArray = explode('#', $value); 26 $rotation2 += $valueArray[1]; 27 $rotation2_end += $valueArray[3]; 28 $balls += $valueArray[2]; 29 $balls_end += $valueArray[4]; 30 31 } 32} 33$midMoney = $start_money + ($balls * 4) - $end_money + ($balls_end * 4); 34$resultMoney = $midMoney/4; 35$resultNOR = ($rotation_end + $rotation2_end) - ($rotation + $rotation2); 36$border = $resultNOR*250/$resultMoney; 37echo $number.'#0#'.$resultMoney.'#'.$resultNOR.'#0('.round($border, 2).')'; 38//317#0#7365#527#0(17.89) 39}

このような記述で無事に出力出来たのですが、

PHP

1Array 2( 3 [0] => 317#118#1490#220#0 4 [1] => 317#220##7000#355##0 5 [2] => 317#355##10000#510##0 6 [3] => 317#510##10000#645##3500 7 [4] => 317###### 8 [5] => 311#0##10000#179##0 9 [6] => 311#179##10000#292##3500 10 [7] => 311#192##23500#586##7500 11 [8] => 311### 12)

このように先頭の317以外の311が出てきた場合に
317から始まるもの、311で始まるもの、を別として計算したいです。

なので出力には、以下のようにしたいです。
317#0#7365#527#0(17.89)
311#0#8125#686#0(21.11)

ですが、私が試みた記述だと、317から始まるもの、311で始まるもの、を別として計算できません。。。

ご教授お願いしたいです。

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

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

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

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

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

guest

回答2

0

以下のようにすれば、配列$data_arrayの各要素を、最初の数字が同じ値で連続しているもの同士でまとめることができます。

あとは、配列$data_array_listの各要素に対してposukee様が書かれたプログラムを適用してやれば、
望む結果が得られると思います。

php

1$data_array = array( 2 '317#118#1490#220#0', 3 '317#220##7000#355##0', 4 '317#355##10000#510##0', 5 '317#510##10000#645##3500', 6 '317######', 7 '311#0##10000#179##0', 8 '311#179##10000#292##3500', 9 '311#192##23500#586##7500', 10 '311###', 11 '317#118#1490#220#0', 12 '317#220##7000#355##0', 13 '317#355##10000#510##0', 14 '317#510##10000#645##3500', 15 '317######', 16); 17 18$data_array_list = array(); 19 20$nowValue = -1; 21$nowIndex = -1; 22foreach ($data_array as $data) { 23 if (preg_match('/^\d+/', $data, $match) !== 1) { 24 exit(1); 25 } 26 27 if ($match[0] <> $nowValue) { 28 $nowValue = $match[0]; 29 $nowIndex++; 30 } 31 32 $data_array_list[$nowIndex][] = $data; 33} 34 35var_dump($data_array_list);

実行結果

array(3) { [0]=> array(5) { [0]=> string(18) "317#118#1490#220#0" [1]=> string(20) "317#220##7000#355##0" [2]=> string(21) "317#355##10000#510##0" [3]=> string(24) "317#510##10000#645##3500" [4]=> string(9) "317######" } [1]=> array(4) { [0]=> string(19) "311#0##10000#179##0" [1]=> string(24) "311#179##10000#292##3500" [2]=> string(24) "311#192##23500#586##7500" [3]=> string(6) "311###" } [2]=> array(5) { [0]=> string(18) "317#118#1490#220#0" [1]=> string(20) "317#220##7000#355##0" [2]=> string(21) "317#355##10000#510##0" [3]=> string(24) "317#510##10000#645##3500" [4]=> string(9) "317######" } }

投稿2015/10/25 14:15

KiyoshiMotoki

総合スコア4791

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

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

退会済みユーザー

退会済みユーザー

2015/10/26 06:15

御回答頂きましてありがとうございます。 最初の数字が同じ値で連続しているもの同士で、まず配列に入れてしまってから処理したほうがよかったんですね! 同じ数字が連続しているもんを配列に入れる方法など勉強になりました! 実装頑張ってみます!
guest

0

質問のコードを
foreach(["317","311"] as $group) {
}
で括って、
foreach($data_array as $value) {
の直後に
if(strpos($value, $group) !== 0) continue; // 対象配列以外は読み飛ばす
を実装してみてください。

foreach(["317","311"] as $group) {
の部分を、動的化するには、
foreach($groupList as $group) {
と、["317","311"]を変数化する事を思いつけると良いです。

で、$groupListを事前に作るのですが、
どう実装をするか?の前に、
修正前の現状仕様がどうなっているか把握し、
また、どういう仕様に修正するのかをきっちり決めてみてください。
と、言いますのは、テキストエリアに"200######"なしで、
$groupList = ["317","311","200"];
としてみて動きを見てみてください。
頭が0#で始まる、不明な出力が出て来ますよね。
恐らく、こういうのは意図していないのではないでしょうか。

修正前の現状仕様がどうなっているか把握し、』について

ご質問内で、

最後の317######は無視

とおっしゃってますが、私から見ますと、重要なデータに見受けられます。
試しに、そのデータ無しに、ご自身で書かれたコードを動かしてみてください。
恐らく、期待する結果とはならないのではないでしょうか。
この辺り、データ1つ1つどのような意味があって、
期待する処理結果が何であったのか、をしっかりと把握して欲しいです。

どういう仕様に修正するのかをきっちり決めて』について

  • ①最終的にどのような処理結果とするのかを「きっちり」決める

例えば、テキストエリアに200開始の配列がなくても、
結果には200開始の処理結果を出力したい、など、
一言に「任意」といっても期待する結果は多種存在しますよね。
なので、どういう仕様にするかきっちり決める必要があります。

  • ②「どういう仕様に修正するか」決める

ご自身の思い描く仕様修正が、修正箇所ごとに追加なのか変更なのか、
現状仕様と照らしあわせて、検討してみてください。

ご参考までに、私の当初回答を覧ていただきたいですが、
質問前の仕様をブラックボックス的に捉え、
317に加えて311を増やすという、
仕様追加の形で回答させていただきました。
なので、質問のコードの変更のない形での回答となった次第です。
(※処理の流れは変わっていますので、この意味での「コードの変更のない」は語弊があります。)

これらから、ようやく実装の修正方法が、
つまり、$groupListの作り方や既存部分の修正可否が明確になってきます。

長々とした説明となってしまいましたが、$groupListの作り方だけ、一例として載せておきます。

$groupList = array(); foreach($data_array as $value) { $header = explode('#', $value)[0]; if(!in_array($header, $groupList)) { array_push($groupList,$header); } } var_dump($groupList); // $groupListのチェック

投稿2015/10/25 10:24

編集2015/10/25 17:56
TetsujiMiwa

総合スコア1124

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

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

退会済みユーザー

退会済みユーザー

2015/10/25 11:05

ありがとうございます。 317や311は、任意の値です。510や420が入って来る可能性もあります。。。><
退会済みユーザー

退会済みユーザー

2015/10/26 06:17

沢山ご教授いただきありがとうございます! まず組む前にどういう仕様かはっきりさせる!ということが大切なんですね。 組みながら考えていたので苦戦していました。 ご返信いただき感謝しております。 勉強と実装の方頑張ります。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問