Friction River Software

  • お問い合わせ

CakePHP5入門【WebAPI編㉔】ナンバーズ3を予想⑧

A子

cronクーロンで毎日(平日のみ)実行している「src/Command/Num3boxCommand.php」だけどさ

PDF化しているのは「出現時期の古い順」の1ページだけだよね

B美

そうね

A子

従来のはそのまま残しといて、2ページ目に前回のスコア加算アルゴリズムを使った「スコアの多い順」を追加しようよ

PDFって、改ページができるんだよね?

C菜

当然できるはずですよ~
(よく見かけますもん)

mPDFでのやり方は知りませんけど~

B美

CSSで改ページを指定する方法と、mPDFのメソッドを呼び出す方法の二種類があるわね
もしもインスタンス化したオブジェクトの参照を「$mpdf」で指しているとするならば

$mpdf->addPage();

この命令を2ページ目を出力する直前に実行するだけよ

C菜

CSSのほうが分かりやすいと思うんですけど、その場合はどうなりますか~

B美

HTMLコンテンツの中の1ページ目と2ページ目の境目に以下の一文を入れるだけね

<div style="page-break-before: always"></div>

HTMLコンテンツを格納する変数を一つだけ用意して、一気に2ページ分を出力させるならCSS制御かしらね

逆に、複数の変数にそれぞれ1ページ目のデータと2ページ目のデータを入れて、順番にPDF出力を行うなら「addPage」メソッドだと思うわ

A子

なるほどなるほど

だったら今回は「addPage」メソッドのほうでやってみよう
(HTMLデータを別の変数に分けたほうが管理しやすそうだから…)

んじゃ、「src/Command/Num3boxCommand.php」の「execute」メソッドに追記していくよ

//PDFへの書き出し
$mpdf->WriteHTML($css, HTMLParserMode::HEADER_CSS);
$mpdf->WriteHTML($content, HTMLParserMode::HTML_BODY);
と
//格納ディレクトリ
$dir = WWW_ROOT."pdf".DS.date('Ym').DS;
if (!is_dir($dir)) {
    mkdir($dir, 0755, true);
}

の間に2ページ目の処理を追加したらどうかな?

//ここから2ページ目
$result2 = [];
if ($pattern == 'A' || $pattern == 'C') {
    //パターンAまたはパターンC
    $odd_even_score_array = [9, 41, 42, 9];
    $sum_score_array = [0, 0, 0, 5, 5, 10, 15, 15, 20, 30, 35, 35, 40, 45, 40, 35, 45, 40, 30, 20, 15, 10, 10, 5, 5];

    foreach ($result as $idx => $val) {
        //出現時期の古い順
        $rank_score = 60 - $idx;

        //予想数字を各桁ごとに分解
        $num3_str = $val[0];
        $num3_int = intval($num3_str);
        $num3_place1 = intval($num3_int % 10);
        $num3_place10 = intval($num3_int % 100 / 10);
        $num3_place100 = intval($num3_int / 100);

        //奇偶スコア
        $odd_even_total = ($num3_place100 % 2) + ($num3_place10 % 2) + ($num3_place1 % 2);
        $odd_even_score = $odd_even_score_array[$odd_even_total];

        //各桁の合計スコア
        $sum_total = $num3_place1 + $num3_place10 + $num3_place100;
        $sum_score = $sum_score_array[$sum_total];

        //三種類のスコアの総合計
        $total_score = $rank_score + $odd_even_score + $sum_score;

        //結果を格納
        array_push($result2, [$num3_str, $rank_score, $odd_even_score, $sum_score, $total_score]);
    }
}

こんな感じ?

C菜

最後に「合計点の多い順での並べ替え」が必要ですよ~

//総得点の降順で並べ替え
array_multisort(array_column($result2, 4), SORT_DESC, $result2);

んで、続きはこうでしょうか~
(PDF化の処理です~)

//コンテンツ
$content2 = '';
if (count($result2) == 0) {
    $content2 .=<<<EOF
    <div style="width: 100%;text-align: center;">
        <h3>ボックス値(予想)【2/2】</h3>
        【{$year}年{$month}月{$day}日】
        <br /><br /><br />
        <span style="color: red;">パターンA及びパターンC以外の購入については推奨できません。</span>
    EOF;
} else {
    $content2 .=<<<EOF
    <div style="width: 100%;text-align: center;">
        <h3>ボックス値(予想)一覧【2/2】</h3>
        【{$year}年{$month}月{$day}日】…<span style="color: red;">三つのスコア合計(総得点)の降順</span>
        <br />
        <table>
            <tbody>
                <tr>
                    <th style="width: 50px;">順位</th>
                    <th style="width: 100px;">ボックス値</th>
                    <th style="width: 100px;">出現時期の古い順<br />による得点</th>
                    <th style="width: 100px;">奇数・偶数パターン<br />による得点</th>
                    <th style="width: 100px;">三桁の数字の合計<br />による得点</th>
                    <th style="width: 100px;">総得点</th>
                </tr>
    EOF;

    foreach ($result2 as $idx => $val) {
        $rank = $idx + 1;
        if ($rank <=10) {
            $content2 .= "<tr><td class='top10'>{$rank}</td><td class='top10'>{$val[0]}</td><td class='top10'>{$val[1]}</td><td class='top10'>{$val[2]}</td><td class='top10'>{$val[3]}</td><td class='top10'>{$val[4]}</td></tr>";
        } else {
            $content2 .= "<tr><td>{$rank}</td><td>{$val[0]}</td><td>{$val[1]}</td><td>{$val[2]}</td><td>{$val[3]}</td><td>{$val[4]}</td></tr>";
        }
    }
    $content2 .=<<<EOF
            </tbody>
        </table>
        <span style="color: red;font-size: small;">※候補数字60個は1ページ目【1/2】と同一です。並び順のみ変更しています。</span>
    </div>
    EOF;
}

//PDFへの書き出し
$mpdf->addPage(); //改ページ
$mpdf->WriteHTML($content2, HTMLParserMode::HTML_BODY);

A子

2ページ目を【2/2】と表記するなら、1ページ目も同様に【1/2】を追加しないとね
(あと、コメントも…)

<h3>ボックス値(予想)一覧【1/2】</h3>
【{$year}年{$month}月{$day}日】…<span style="color: red;">出現時期の古い順</span>

以下が全体像だよ
(コード量がさらに増した…(苦笑))













C菜

実行確認してみましょう~
「MATE端末」を立ち上げてっと…

cd html/numapp[Enter]
bin/cake num3box[Enter]

大丈夫みたいです~
(PDFファイルもきちんと作成されましたよ~)

A子

よし
あとはこれ(Num3boxCommand.php)をサーバ(本番環境)にアップしてっと…



C菜

2026年9月14日(月)の結果はこうなりました~

ばっちり2ページ目が作られてますよ~


B美

それで結果はどうだったのかしら?

的中したの?

A子

この日(2026年9月14日)の結果は「188」、つまりダブルだったよ

大外おおはずれ(笑)

B美

笑い事じゃねぇよ(苦笑)

まぁ、まだ9月の中旬だし、しばらくは放置ね

C菜

ですね~