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

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

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

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

Q&A

解決済

1回答

1233閲覧

PHP 配列 計算

Z-TALBO

総合スコア525

PHP

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

0グッド

0クリップ

投稿2017/04/07 10:10

編集2017/04/07 10:35

###テストデータ

PHP

1$test[] = ['A', '1', '100', '2017-04-01', '09:00']; 2$test[] = ['A', '2', '150', '2017-04-01', '10:00']; 3$test[] = ['A', '1', '100', '2017-04-01', '11:00']; 4$test[] = ['A', '2', '140', '2017-04-01', '12:00']; 5$test[] = ['B', '1', '100', '2017-04-01', '09:00']; 6$test[] = ['B', '2', '140', '2017-04-01', '10:00']; 7$test[] = ['B', '2', '140', '2017-04-01', '13:00']; 8$test[] = ['C', '1', '100', '2017-04-01', '09:00'];

###やりたいこと
上記のテストデータは実際はデータベースに入っていて、それを日付で抽出したというイメージです。
並びは$test[][0] ASC, $test[][4] ASCという並び変えをしたと想定します。

1.$test[][1] === '2'の時$test[][2]の値と
その上の$test[][1]の値が'1'のデータの$test[][2]の値を引き算したい
今回Aの場合
$test[1][2] - $test[0][2] = 50
$test[3][2] - $test[2][2] = 40

2.$test[][1] === '2'があるのにその上に$test[][1] === '1'が無い場合
今回Bの場合
$test[5][2] - $test[4][2] = 40
$test[6][2] - //// = 計算できない場合は計算しない

3.$test[][1] === '1'はあるが、'2'が無い場合
今回Cの場合
//// - $test[7][2] = 計算できない場合は計算しない

4.もしも計算できたときその値が50以上かどうかで値を変える
if(計算結果 < 50) { 計算結果 = 0 }
としつつ、
計算結果A1 = 50 + A2 = 0 == 合計 50というような計算を含ませたい。

いろいろ、問題がある部分はあろうかと思いますが、とりあえずこのような状況において処理ができるかどうか?
宜しくお願いいたします。

###一応やってはみたこと
とりあえず回しながらするとして、、、

PHP

1foreach($test as $T) { 2 // まずは1の値を保存しておかないといけないので、その時に変数に入れておく 3 if($T[1] === '1') { 4 $one = $T[2]; 5 } 6 // 次に2の時はさっきとっておいた$oneと計算させる 7 if($T[1] === '2') { 8 $cal = $T[2] - $one; 9 } 10}

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2017/04/07 10:46

配列の想定しうる規模次第によっては、SQLでズバリ算出した方がいいケースもありますが、今回はphp上での処理にこだわりますか?
Z-TALBO

2017/04/07 10:56

確かに、SQLで!というのもあろうかと思いますが、今回はPHP上で処理してみたいと思います。
guest

回答1

0

ベストアンサー

SQL側の処理だと思いますが、提示された仕様のまま冗長に書けばこんな感じでしょうか?

PHP

1$test=[ 2 ['A', '1', '100', '2017-04-01', '09:00'], 3 ['A', '2', '150', '2017-04-01', '10:00'], 4 ['A', '1', '100', '2017-04-01', '11:00'], 5 ['A', '2', '140', '2017-04-01', '12:00'], 6 ['B', '1', '100', '2017-04-01', '09:00'], 7 ['B', '2', '140', '2017-04-01', '10:00'], 8 ['B', '2', '140', '2017-04-01', '13:00'], 9 ['C', '1', '100', '2017-04-01', '09:00'], 10 ]; 11 12$sum=0; 13array_walk($test,function($a,$b) use($test,&$sum){ 14 if($b<count($test)-1 and $a[1]=='1' and $test[$b+1][1]=='2'){ 15 $num=$test[$b+1][2]-$test[$b][2]; 16 if($num>=50) $sum+=$num; 17 } 18}); 19print $sum;

投稿2017/04/07 11:34

yambejp

総合スコア114825

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

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

Z-TALBO

2017/04/08 01:37

今回はPHP側でという制約にさせていただきましたが、今度はSQL側で考えることもあると思いますので、その時はまたよろしくお願いいたします。 回答ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問