プログラミング

引き継ぎ考慮のメッセージID重複回避編 PHPポケモン 58

PHP PHPポケモン ポケモン
引き継ぎ考慮のメッセージID重複回避編 PHPポケモン 58

今回のPHPポケモンでは内部の作り込みをしていきます。見た目への反映は無いので、プレイを楽しみにしている人や、ポケモンが好きで毎日チェックしてくれているような人は、ブラウザをバックしてもらって問題ありません。

 

それでは、前々回辺りから保留にしていた「メッセージIDに重複回避対策」についてです。

 

引き継ぎ処理による重複対策

メッセージIDが重複しないように、セッションに生成した値を格納していましたが、処理が終わればすべて破棄して次の処理へ移行しています。その関係上、技習得で導入したレスポンスやメッセージ、モーダルの引き継ぎで「引き継いだデータで使用されているIDと重複する可能性」が出てきてしまいました。

接頭語を除けば16桁のランダム文字列を生成しているため、これが多くても10個程度の新しく生成したIDと重複する可能性はほぼ0%と言っても良いでしょう。しかし、問題は「0ではない」ということです。0ではない以上は対策が必要です。

 

それでは対策方法についてです。

メッセージの引き継ぎがあった場合、そのIDを重複チェック用のセッションに格納します。これをメイン処理の前に行うことで、メッセージIDの重複チェックの対象に引き継いだメッセージIDも含めていきましょう。

 

まずはコントローラーの親クラスのコンストラクタに以下の判定を追加しましょう。

 

コントローラー(/App/Controllers/Controller.php
// メッセージIDの重複回避
if(
    isset($_SESSION['__data']['before_reponses'])
    || isset($_SESSION['__data']['before_messages'])
    || isset($_SESSION['__data']['before_modals'])
){
    $this->avoidMessageId();
}

 

issetを使って、引き継ぎがされているかをチェックしています。もし該当セッションにデータが格納されていれば、avoidMessageIdというメソッドを呼びだして、既に使用されているメッセージIDを取り出します。

 

array_filterを使った抽出

それでは、IDの抽出方法について見ていきましょう。これにはarray_filter関数を使用します。

 

第1引数に対象となる配列を指定し、第2引数でコールバック関数を指定します。

第1引数では、メッセージIDを値とした配列を指定する必要があるので、技習得時に引き継ぎ処理でも使用したarray_keysまたはarray_columnを使いましょう。

 

レスポンスからIDを抽出
array_keys($_SESSION['__data']['before_responses'])
メッセージからパラメーターを抽出
array_column($_SESSION['__data']['before_messages'], 1)
モーダルからパラメーターを抽出
array_column($_SESSION['__data']['before_modals'], 0)

 

レスポンスにはキーとして、メッセージには配列の2番目(添字1)、モーダルには1番目(添字0)にメッセージIDが格納されています。なので、それぞれに合わせた方法で取り出しました。

 

ですが、これではレスポンスの場合はメッセージID以外の添字やキー、メッセージとモーダルには空の値などが含まれることになります。なので、ここからメッセージIDのみを抽出するため、array_filterの第2引数のコールバック関数で判定を行います。

// array_fillterコールバック用関数
function callback($msg_id){
    // 行頭にmsgがついているかを判定
    return preg_match('/^msg/', $msg_id);
}

 

preg_matchを使って正規表現で、行頭がmsgで始まるものだけを判定しました。もし一致すれば1、一致しなければ0が返り値となり、1が返った場合だけarray_filterの返り値として配列に格納されていきます。

 

例として、レスポンスからメッセージIDを抽出する処理を見てみましょう。

// 格納用の空配列
$results = [];
// array_fillterコールバック用関数
function callback($msg_id){
    // 行頭にmsgがついているかを判定
    return preg_match('/^msg/', $msg_id);
}
// レスポンス
if(isset($_SESSION['__data']['before_responses'])){
    $results = array_filter(
        array_keys($_SESSION['__data']['before_responses']),
        'callback'
    );
}

 

メソッド内でコールバック用の関数を事前に用意しておき、array_filterで呼び出しています。抽出結果は変数の$resultsに格納していきます。

 

array_diffによる差分チェック

次に、抽出したIDの差分チェックを行います。例えば、レスポンスとメッセージを引き継いだ場合、もちろんそこには同じIDが含まれることになります。重複チェック用のセッション内で既に重複した値が入っているのはおかしいので、もし取り出した値が既に抽出されていなければ結果へ追加するという処理が必要になります。

そのために配列の差分をチェックするarray_diff関数を使用します。 

 

第1引数には比較元の配列、第2引数以降には比較対象の配列が入ります。今回のケースであれば、まずレスポンスからメッセージIDを抽出して$resultsに格納しています。メッセージからメッセージIDを抽出して、その結果が$resultsとかぶっているものは必要ありませんね。

array_diffでは、比較元(第1引数)の中で比較対象(第2引数以降)には無い値を配列として返り値にするので、第1引数に新しく取り出した配列、第2引数に$resultsを指定して差分を取り出します。

メッセージからIDを抽出するケースを見てみましょう。

$msg_ids = array_filter(
    array_column($_SESSION['__data']['before_messages'], 1),
    'callback'
);
$diff = array_diff($msg_ids, $results);

 

これで$diffに、既に取り出されたメッセージID以外のメッセージIDが格納することができます。

最後にこの結果を$resultsに追加するためのarray_mergeを使用しましょう。 

// メッセージ
if(isset($_SESSION['__data']['before_messages'])){
    $msg_ids = array_filter(
        array_column($_SESSION['__data']['before_messages'], 1),
        'callback'
    );
    // 結果の差分を格納
    $results = array_merge($results, array_diff($msg_ids, $results));
}

これで差分だけを$resultsに追加することができました。

 

以下、avoidMessageIdメソッドの最終コードです。

/**
* メッセージIDの重複回避
*
* @return void
*/
private function avoidMessageId()
{
    // 格納用の空配列
    $results = [];
    // array_fillterコールバック用関数
    function callback($msg_id){
        // 行頭にmsgがついているかを判定
        return preg_match('/^msg/', $msg_id);
    }
    // レスポンス
    if(isset($_SESSION['__data']['before_responses'])){
        $results = array_filter(
            array_keys($_SESSION['__data']['before_responses']),
            'callback'
        );
    }
    // メッセージ
    if(isset($_SESSION['__data']['before_messages'])){
        $msg_ids = array_filter(
            array_column($_SESSION['__data']['before_messages'], 1),
            'callback'
        );
        // 結果の差分を格納
        $results = array_merge($results, array_diff($msg_ids, $results));
    }
    // モーダル
    if(isset($_SESSION['__data']['before_modals'])){
        $msg_ids = array_filter(
            array_column($_SESSION['__data']['before_modals'], 0),
            'callback'
        );
        // 結果の差分を格納
        $results = array_merge($results, array_diff($msg_ids, $results));
    }
    // 重複回避用セッションに格納
    $_SESSION['__message_ids'] = $results;
}

 

これで、引き継ぎも含めたメッセージIDの重複を回避することができるようになりました。

 

まとめ

いかがだったでしょうか。

今回のPHPポケモンでは、引き継ぎも含めたメッセージIDの重複回避方法をご紹介しました。

 

プログラミング上達のコツは「どうなっているか」がどれだけ理解出来ているかです。コピペでもサイトやシステムは動作しますが、それを本格的に自分のものにしていくためには、やはり「どの処理で、どの値が、どうなっているか」をしっかりと理解できていなければなりません。

また、便利な関数をどれだけ使いこなせるかも、よりスマートかつ負担の少ないシステムを作り上げるためには必要なことです。そして、関数すべてを覚える必要はありません。必要に応じて再現できる関数があるかどうかを公式マニュアルなどを参考にしながら探して、それを使えれば良いのです。

その中でも、コールバック関数を引数として必要とするような関数は、その結果や記述方法がややこしくなりがちです。そういったときは、オンラインエディターなどを使って、細かくどういった値が返却されるのかをチェックしていくと良いでしょう。

 

現在プログラミング学習に取り組んでいる方や、WEBプログラミングに興味がある人は、ぜひ参考にしてみてくださいね。

 

注目の記事

フィールド効果技編(しろいきり) PHPポケモン 50
プログラミング
PHP,PHPポケモン,ポケモン
フィールド効果技編(しろいきり) PHPポケモン 50

フィールド効果技とは ポケモンの技の中には、ポケモンに対して状態変化や異常を与えるもの以外に、フィールド自体に効果を持たせるものがいくつかあります。PHPポケモンでは未実装ですが、そういったフィールド効果技はポケモンを交代したとしても場に効果が残り続けます。  場の状態(ポケモンwiki) https:/...

引き継ぎ考慮のメッセージID重複回避編 PHPポケモン 58
プログラミング
PHP,PHPポケモン,ポケモン
引き継ぎ考慮のメッセージID重複回避編 PHPポケモン 58

今回のPHPポケモンでは内部の作り込みをしていきます。見た目への反映は無いので、プレイを楽しみにしている人や、ポケモンが好きで毎日チェックしてくれているような人は、ブラウザをバックしてもらって問題ありません。   それでは、前々回辺りから保留にしていた「メッセージIDに重複回避対策」についてです。 &...

ブログ収益化の道!挫折ポイントの回避方法を徹底解説【アドセンス合格は通過点、意外な収益ポイントとは】
ライティング
Google AdSense,ブログ
ブログ収益化の道!挫折ポイントの回避方法を徹底解説【アドセンス合格は通過点、意外な収益ポイントとは】

  ノマドワークや副業としてブログ単体で稼げるようになりたいと考えている人は多いですが、その大半は挫折してしまいます。 アドセンスの合格までに辿りつけなかったり、合格したは良いものの思うように伸びずに諦めてしまうというのがほとんどです。 実は、そのアドセンスに対する考え方自体が間違いであり...

パーティー実装編 トレーナーの作成 PHPポケモン 63
プログラミング
PHP,PHPポケモン,ポケモン
パーティー実装編 トレーナーの作成 PHPポケモン 63

パーティーとは ポケモンでは、ゲーム・アニメ共に最大6匹のパートナーポケモンと旅をすることができます。7匹以上は持ち歩くことができず、ボックスに転送されてしまうという仕組みです。そして、その6匹のパートナーポケモンの構成をパーティーと呼んでいます。 現在のPHPポケモンでは1匹のポケモンしか管理で...

ピカチュウから学ぶオブジェクト指向 〜進化編〜 7
プログラミング
PHP,PHPポケモン,オブジェクト指向,ポケモン
ピカチュウから学ぶオブジェクト指向 〜進化編〜 7

  ※前回(第6回)で意味不明な場所に空変数が入っており、ステータスが一部しか出力できないという問題がありました。修正しています。犯人は「$stats = [];」です。(GetTrait.php)   今回はポケモンのゲームでは欠かせない、楽しみの一つとなる「進化システム」を導入していきます。これからPHPポ...

毎日継続をするためのコツ
雑記
毎日継続をするためのコツ

定期的にコラムを書きたくなるので、今回は「毎日継続をするためのコツ」というテーマで自分が意識していることや、感じたことを書き綴っていきます。 決して開発や業務で追われていたり、PHPポケモンの大幅見直しを迫られているわけではありません。   毎日継続するために  ブログや学習など、毎日継続...

【脱初心者向けプログラミング学習】処理を追え!「今、変数には何が入ってる?」
プログラミング
HTML,PHP,プログラミング学習
【脱初心者向けプログラミング学習】処理を追え!「今、変数には何が入ってる?」

  初心者から中々抜け出せない 1から処理をかけない   そんな悩みを抱えたプログラミング学習者に向けて、「脱初心者のためのプログラミング学習」についてPHPを例にまとめました。 やり方自体は同じですので、他の言語をメインとしている人は自分の環境に置き換えながら学習して、初心者から抜け出しましょ...

スキル習得で挫折しないための3ステップ
雑記
デザイン,ブログ,プログラミング
スキル習得で挫折しないための3ステップ

  せっかく高い教材を買ったのに、気づいたら積んでしまっている・・・   そんな悩み、あなたには有りませんか? 今回は、そんな方のための勉強方法をテーマに説明していきます。 正しい勉強方法を身に着けていれば、どういったメリットがあるのでしょうか? 三日坊主になりにくい いざという...

カテゴリ

SEO対策 イベント デザイン ネットワーク ビジネスモデル フリーランス プログラミング マーケティング ライティング 動画編集 雑記

タグ

5G Adobe AfterEffects AI ajax amazon Animate api artisan atom Automator AWS Bluetooth CSS CVR description EC-CUBE4 ECショップ ESLint Facebook feedly foreach function Google Google AdSense Honeycode htaccess HTML IEEE 802.11ax Illustrator Instagram IoT JavaScript jQuery jQuery UI keyword LAN Laravel Linux MacBook MAMP meta MLM MySQL NoCode note OS OSI参照モデル Paypal Photoshop PHP phpMyAdmin PHPポケモン PremierePro rss SEO SEO対策 Sequel Pro Skype SNS SSH Symfony TCP/IP title Toastr Trait Twig Twitter UCC V系 WAN WebSub Wi-Fi wiki Windows WordPress XAMPP xml Xserver YouTube YouTuber Zoom アーティスト アウトプット アクセス層 アニメーション アフィリエイト イーブイ インターネット インプット エンジニア オブジェクト指向 お金配り クリック単価 クリック数 コミュニケーション能力 コロナ コンサルティング サムネイル システムエンジニア スタートアップ スタイルシート スパム データベース ディープフェイク デザイナー デザイン テレワーク ナンパ ニュース ネットワークモデル ノマドワーク バナー ピカチュウ ビジネス フィード フリーランス ブロガー ブログ プログラマー プログラミング プログラミング学習 プログラミング教育 プロトコル ホームページ制作 ポケモン マークアップ マーケティング メール リモートワーク レンダリング 三井住友 三宮 仕事依頼 児童デイ 児童デイサービス 児童発達支援 公開鍵 初心者 助成金 勉強法 営業 広告 広告収入 必勝マニュアル 放課後等デイサービス 朝活 楽天 深層学習 無線LAN 独立 神戸 福祉 秘密鍵 翻訳 自己啓発 英語 見積書 計算機 読書 起業 迷惑メール 配列 銀の弾丸 集客 雑学力