環境
PHP 7系
Laravel Framework 8.49.0
やりたいこと
PHP
1$moto_data1 = [12345, 5, 12346, 9, 12347, 11, 12348, -1 , ...]; 2$moto_data2 = 同上; 3 ...
という配列があります。
合計5つあります。
偶数の要素は3600をかけることで時間に変換する必要があります。
奇数の要素は値を示しています。そのまま後続処理で活用します。
こういう並び方をした配列が5つあります。
※1つの配列につき、約10万件前後の要素数があります。
この時、現在、以下のソースで処理させようとしていますが、1つ分の配列を処理したところ、7秒かかってしまいました。
PHP
12次元配列を分割するメソッド 2 public function explodeTwoDimensional($tdArray): array 3 { 4 if (empty($tdArray)){ 5 var_dump($tdArray); 6 return [null,null]; 7 } 8 9 $date = $val = null; 10 $idx = 0; 11 $maxIdx = count($tdArray) - 1; 12 foreach ($tdArray as $arr){ 13 $date[] = $tdArray[$idx]; 14 $val[] = $tdArray[$idx + 1]; 15 16 $idx += 2; 17 if ($maxIdx <= $idx){ 18 break; 19 } 20 } 21 return [$date, $val]; 22 }
分割処理は、「microtime」で計測したところ、約0.0037秒で終わります。
PHP
1 $viewValue = []; ・・・結果表示用 2 $tmpVal = explodeTwoDimensional($moto_data1); 3 ⇒$tmpVal[0] = 時間データ 4 $tmpVal[1] = 値データが入っています 5 6 foreach ($timeStamp as $time){ 7 $temp = null; 8 $idx = 0; 9 foreach ($tmpVal[0] as $valTime){ 10 if ($time=== $valTime){ 11 $temp = $tmpVal[1][$idx]; 12 $tmpVal= array_slice($tmpVal[0], $idx); 13 ↑過ぎた日付は無意味なので次の要素比較で比較しないよう配列を更新してます 14 break; 15 } 16 ++$idx; 17 } 18 $viewValue[] = $temp; 19 }
動きとしては、$timestampは、5つあるmoto_dataの日付がすべてマージされています。(マスターデータ)
10万件データ(moto_data1)は、マスターデータと比較して、日付があれば、その日付に対応する値をviewValueに入れる。なければnullを入れるという流れで組んでいます。
しかし、こうすると、マスターデータの件数xmoto_dataの数となるので、ループ数が跳ね上がり、処理時間が増加しているようです。
moto_data1だけでも7秒程度かかるので、5つあれば単純計算35秒ほどかかる見込みです。
しかし、許容される処理時間は、5つの配列をすべて処理したとしても、「3秒以内」に収めないといけません。
これを解決する方法はありますか?

回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/07/05 22:16