68566


`test.com/hogehoge/?yoko=2&tate=3`のようにURLパラメーターから2つの値を受け取ります。

添付画像のように受け取った2つの値(タテ・ヨコ)から、参照されるデータを突き止めます。  
仮に横が2縦が3でしたら"1,2,3"がほしいわけです。

[![画像の説明をここに入力](https://i.stack.imgur.com/j8p3c.png)](https://i.stack.imgur.com/j8p3c.png)

（求めた数字はまた次の処理に使いますが、一旦関係ないので気にしなくていいです。）

この時どういうやり方で求めたい値を返すのがスマートなのか悩みました。

①if文で縦が〇&横が△のとき～ でやる

[code]

    <?php
      $result = null;
      if($yoko == 1 && 1 <= $tate && $tate <= 3) $result = array(1,2);
      else if($yoko == 2 && 1 <= $tate && $tate <= 3) $result = array(1,2,3);
      else if(1 <= $yoko && $yoko <= 3 && 1 <= $tate && $tate <= 4) $result = array(2,3);
      #続く
    ?>
    
[/code]

表と同じように配列で用意する

[code]

    <?php
      $data = array(
        array(array(1,2),array(1,2,3),array(2,3),array(2,3,4),array(2,3,4),array(3,4,5),array(4,5),array(4,5,6),array(4,5,6)),
        array(array(1,2),array(1,2,3),array(2,3),array(2,3,4),array(2,3,4),array(3,4,5),array(4,5),array(4,5,6),array(4,5,6))
        #続く
      ),
    
      $result = $data[$yoko - 1][$tate - 1];
    ?>
    
[/code]

その他switch文や連想配列などなど...

上記のような書き方で書いてみましたが、あまり賢い書き方に思えずモヤモヤしたので質問しました。  
なにか良い書き方があれば教えて頂きたいです。よろしくお願い致します。


CC BY-SA 4.0
2020-07-13T02:34:24.830
68536
2020-07-14T01:10:39.000
2020-07-13T13:41:32.237
30065
30065
question
php array
表のデータをプログラムで表すスマートな書き方を教えて下さい。


まず前提条件として、今回の表をデータ化してということなので、データ構造の問題となります。  
PHPはデータ構造ではなく、アルゴリズムを扱うことが得意な言語です。  
そのため、いかにきれいにスマートにといってもPHPではあまりきれいにならないという前提に立つ必要があります。

表形式のデータ構造をきれいに整理して扱いやすく管理するには、XMLやjsonやCSVなどの構造化された文書を利用することが最もよいでしょう。今後の保守を考えるとそれらを使うことを検討してみてください。  
システムから修正する要件があるのであれば、それこそDBなども利用することも考えたほうが良いでしょう。

それでもPHPで表形式をデータ構造で利用したい場合は配列を使うことが多いと思います。  
アクセスがしやすいですし、IFと違って変更に耐えうる形になるでしょう。  
あとは可読性の問題なだけかと思っています。となると私でしたらコメントなどを駆使してそれなりにきれいにしますかね。

[code]

    $map = [
    /*  *            0,       1,       2,       3,       4,       5,      6,       7,       8, */
        0 => [   "1,2", "1,2,3",   "2,3", "2,3,4", "2,3,4", "3,4,5",   "4,5", "4,5,6", "4,5,6"],
        1 => [   "1,2", "1,2,3",   "2,3", "2,3,4", "2,3,4", "3,4,5",   "4,5", "4,5,6", "4,5,6"],
        2 => [   "1,2", "1,2,3",   "2,3", "2,3,4", "2,3,4", "3,4,5",   "4,5", "4,5,6", "4,5,6"],
        3 => [   "2,3",   "2,3",   "2,3", "2,3,4", "2,3,4", "3,4,5",   "4,5", "4,5,6", "4,5,6"],
        4 => [   "3,4",   "3,4",   "3,4",   "3,4",   "3,4",   "3,4",   "4,5", "4,5,6", "4,5,6"],
        5 => [   "1,2", "1,2,3",   "2,3", "2,3,4", "2,3,4", "3,4,5",   "4,5", "4,5,6", "4,5,6"],
                                           /*中略*/
    ]
    
[/code]

それでもあまりやりたくはないですね。私だったらJSONもしくはDBで構造化してしまって、それをPHPで参照する方法をとるでしょう。


CC BY-SA 4.0
2020-07-14T01:10:39.000
68566
2020-07-14T01:10:39.000
22665
68536
answer