プログラミング

引き継ぎ考慮のメッセージ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ポケモン「オートロード編(修正版)」17 おまけ:日本語化
プログラミング
PHP,PHPポケモン,ポケモン
PHPポケモン「オートロード編(修正版)」17 おまけ:日本語化

  前回実装したオートローダーの使い方が盛大に間違っていたので、今回その間違いの説明をしながら、正しい実装方法をご紹介します。 申し訳ありません。(誠意)    オートロードについて(再)  必要なタイミングで必要なファイルをrequireまたはincludeするあれです。   前回spl_autoload_reg...

【Laravel7】バリデーションメッセージの日本語化【6系対応】
プログラミング
Laravel,Linux,PHP
【Laravel7】バリデーションメッセージの日本語化【6系対応】

  Laravelのバリデーションメッセージは標準だと英語で返ってきてしまいますね。 1つずつ変更する方法もありますが、言語ファイルを作成して一括変更するほうが開発時間の短縮に繋がります。   今回は「Laravel7のバリデーションメッセージを日本語化する方法」をご紹介します。Laravel6系でも同じ方法ででき...

フリーランスになるなら知っておきたい!無料サービス3選
フリーランス
フリーランスになるなら知っておきたい!無料サービス3選

  「フリーランスになる前に何を準備すればいいの?」 「フリーランス向けの便利なサービスが知りたい」   今回はそんな悩みを抱えた人へ向けて「フリーランスになるなら知っておきたい!無料サービス3選」をご紹介します。 この記事を読んで、フリーランスにとっての悩みである以下の3つの問題を一緒...

なぜプロは有線のマウスやキーボードを選ぶのか?【有線VS無線】
雑記
Bluetooth
なぜプロは有線のマウスやキーボードを選ぶのか?【有線VS無線】

  無線が普及する現代、何故有線のマウスやキーボードは売れているのか   いろんなものが製品の進化と共に無線化している一方、有線の需要も高く、とくにプロなど上層で活躍する人は有線を選択するケースが少なくありません。 今回は、そんな有線と無線の違いや、それぞれのメリットについて解説していき...

ピカチュウから学ぶオブジェクト指向 〜レベルシステム導入編〜 3
プログラミング
PHP,PHPポケモン,オブジェクト指向,ポケモン
ピカチュウから学ぶオブジェクト指向 〜レベルシステム導入編〜 3

  大人気?シリーズ「ピカチュウから学ぶオブジェクト指向」、今回はレベルシステムの導入編です。   第1回(基礎編)、第2回(クラス継承編)で作成したPokemonとPikachuのクラスを使用するので、最初から学習したい人はぜひご参考ください。      レベルシステムの導入   ポケモンのゲ...

ポケモンプロパティ編(全国図鑑No・捕捉率・重さ) PHPポケモン 77
プログラミング
PHP,PHPポケモン,ポケモン
ポケモンプロパティ編(全国図鑑No・捕捉率・重さ) PHPポケモン 77

PHPポケモン記事も記念すべき第77回を迎えることができ、これもひとえに皆様のお力があってのことです。いろんな方のご協力もあり(ドット絵とかドット絵とかドット絵とか)見た目はかなりゲームらしくなってきました。 しかし、肝心のゲーム要素が本家と比べればまだまだ機能も少なく未実装の項目も多いので、これ...

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

  ピカチュウから学ぶオブジェクト指向の第4弾は「トレイト(trait)の活用」についてです。更に、レベルシステムを導入すれば欠かせない経験値システムも合わせて実装します。 第3回からの続きとなりますので、もし前回をまだ見ていない人は是非ご参考ください。   それでは今回もピカチュウと一緒に、...

これをしてはいけません!「よくわかるSEO対策」エンジニアのための基礎知識編
SEO対策
htaccess,HTML,JavaScript,SEO,エンジニア,プログラミング
これをしてはいけません!「よくわかるSEO対策」エンジニアのための基礎知識編

  近年ではWebサイト制作会社や個人事業主はかなり増えてきました。 会社によっては力を入れている部分は異なり、主に「デザイン」「機能(システム)」「SEO」という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 独立 神戸 福祉 秘密鍵 翻訳 自己啓発 英語 見積書 計算機 読書 起業 迷惑メール 配列 銀の弾丸 集客 雑学力