【修正後】
※下記の【修正前】の質問内容が適当ではなかったため、事後的に本質問内容を加筆する形で修正しております。
以下のようなjsonデータを取得しており、当該データも基づきHTMLタグのネスト構造を作成することを意図しております。
JSON
1$json_data ={ 2 "attributes":{ 3 "span": 1, 4 "u":1, 5 "s":0; 6 "blockquote":1; 7 } 8}
上記の例で行けば結果的に作成したい構造は<blockquote><span><u></u></span></blockquote>
となります。
ここで、考慮すべき点としては、以下の点となります。
- jsonデータの順番でタグのネスト化が決定されるわけではない
- 必ず、タグの順番は固定されている
つまり、以下のようにuとspanの位置が異なったとしても、spanは必ずuの外側のネスト構造をとるということになります。
JSON
1$json_data ={ 2 "attributes":{ 3 "u":1, 4 "span": 1, 5 "s":0; 6 "blockquote":1; 7 } 8}
実際には、上記の例以上に要素の種類があり、全てのタグについて、真偽値の1か0かのパターンを総当たりしてタグのネスト構造を出力することを検討しているのですが、以下のように各パターンを総当たりしてそれぞれの形式を出力すると非常に煩雑であると感じています。
php
1$d_json = json_decode($json_data,true); 2$b1 = $d_json["attributes"]["u"]; 3$b2 = $d_json["attributes"]["span"]; 4$b3 = $d_json["attributes"]["s"]; 5$b4 = $d_json["attributes"]["blockquote"]; 6if($b1 && $b2 && !$b3 && $b4){ 7 echo "<blockquote><span><u></u></span></blockquote>"; 8}
このようなケースで合理的、かつのちの管理面からも効果的なコーディングについてアドバイスをいただけると幸いです。
よろしくお願い申し上げます。
【修正前】
以下のような真偽値をとる3つの変数がありこれらが総当たりのような形で処理が分岐します。
3つであれば、以下のように純粋なIF文
やIF-ELSE文
で対応できるのですが、例えば変数が10個の総当たりのような場合には見通しや管理も困難なことになります。
実際に実務上、下記のような分岐ケースにおいては、このように総当たりIF分岐処理を書くのでしょうか?それともよりSMARTな方法があればアドバイスを頂けると大変嬉しいです。
宜しくお願い申し上げます。
php
1$apple = false; 2$banana =true; 3$orange = false; 4 5IF($apple && $banana && $orange){ // 処理A ;} 6IF($apple && !$banana && !$orange){ // 処理B ;} 7IF($apple && $banana && !$orange){ // 処理C ;} 8IF(!$apple && $banana && $orange){ // 処理D ;} 9IF(!$apple && !$banana && $orange){ // 処理E ;} 10IF(!$apple && !$banana && !$orange){ // 処理F ;} 11
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/04/19 04:03
2021/04/19 04:07
2021/04/19 04:34
2021/04/19 08:51
退会済みユーザー
2021/04/20 03:22 編集
回答7件
0
めっちゃエスパー回答ですが、総当たりではなくてフラグ管理っぽいものを想定してませんか?
もしそうならビット演算を使ったフラグ処理 php
あたりで調査してみると良いかと。
古い記事しか見当たらなかったので、適当なのにリンク張っときますw
中身精査してません。
【PHP入門講座】 ビット演算 - @mpyw さん
PECL::BitSet - @rana_kualu さん
投稿2021/04/19 04:36
退会済みユーザー
総合スコア0
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2021/04/19 05:54
退会済みユーザー
2021/04/19 08:48
退会済みユーザー
2021/04/19 10:23
2021/04/20 02:14
退会済みユーザー
2021/04/20 02:48
退会済みユーザー
2021/04/20 03:06
退会済みユーザー
2021/04/20 03:12 編集
2021/04/20 03:45
2021/04/20 03:51
退会済みユーザー
2021/04/20 06:51 編集
2021/04/20 04:21 編集
退会済みユーザー
2021/04/20 04:36
退会済みユーザー
2021/04/20 10:56
退会済みユーザー
2021/04/20 11:45
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2021/04/19 09:18
2021/04/19 09:34
2021/04/19 14:39
2021/04/20 02:34
2021/04/20 06:14
2021/04/20 06:34
2021/04/20 07:16
2021/04/20 07:24
0
自分のやり方はトークンを作ります(実装経験あります)
PHP
1//true or falseでトークンを作る 2$apple = $apple === true? 1:0; 3$banana = $apple === true? 1:0; 4$orange = $apple === true? 1:0; 5$token = "f".$apple.$banana.$orange; 6 7//メソッドはクラスで管理。別ファイルの方が後々管理はしやすい 8class Func 9{ 10 public $apple; 11 public $banana; 12 public $orange 13 public function __construct($apple,$banana,$orange){ 14 } 15 public function func111(){ 16 } 17 public function func100(){ 18 } 19 public function func010 20 … 21 public function other_case(){ 22 } 23} 24 25$Func = new Func($apple,$banana,$orange); 26switch($Func){ 27 //採用されたパターン 28 case "f000": $Func -> func111(); 29 break; 30 case "f100": $Func -> func100(); 31 break; 32 case "f010": $Func -> func010(); 33 break; 34 //パターン外 35 default: $Func -> other_case(); 36 break; 37} 38
あとはそのトークンを目印にしてswitch
で必要に応じてパターンを増やしていけばいいと思います。こうすればパターン外でも処理できます。
また関数はクラスで管理しておくと後々困りませんし、別ファイルで管理しておくといいでしょう。
switchを使ったのは分岐の時点でどのパターンが採用されているか明白にしているためです。
投稿2021/04/19 06:57
編集2021/04/23 00:28総合スコア3633
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2021/04/19 08:53
2021/04/20 02:25
退会済みユーザー
2021/04/20 02:57
2021/04/20 06:59 編集
退会済みユーザー
2021/04/21 08:20
2021/04/22 02:23
0
エスパー回答、タイプ2。
$apple = false; $banana =true; $orange = false;
で、8通りの状態が存在しますが、
if ($apple) { } else { } if ($banana) { } else { } if ($orange ) { } else { }
で、8通りの処理が行えます。(else節がなくても8通り)
そうなるように$apple,$banana,$orangeを導き出しておくのがプログラミング、ということです。
投稿2021/04/19 06:05
総合スコア496
0
ベストアンサー
全然別の回答になるので、新しく分けました。
要件的には、総当たりとか考える必要なくて、個別にフラグ処理してあげればよさそうですね。
各フラグによって、文字列を入れたり入れなかったりします。
php
1<?php 2$input = '{ 3"attributes":{ 4"span": 1, 5"u":1, 6"s":0, 7"blockquote":1 8} 9}'; 10$input_arr = json_decode($input, TRUE)['attributes']; 11 12$result = implode([ 13 $input_arr['blockquote']?'<blockquote>':'', 14 $input_arr['span']?'<span>':'', 15 $input_arr['u']?'<u>':'', 16 $input_arr['s']?'<s>':'', 17 $input_arr['s']?'</s>':'', 18 $input_arr['u']?'</u>':'', 19 $input_arr['span']?'</span>':'', 20 $input_arr['blockquote']?'</blockquote>':'', 21 ]); 22echo $result; 23 24// <blockquote><span><u></u></span></blockquote>
回答では 三項演算子を使用/配列を連結 しましたが好きにしてください。
投稿2021/04/20 10:53
退会済みユーザー
総合スコア0
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2021/04/20 11:50
2021/04/20 13:33
2021/04/20 13:55
2021/04/20 14:12
退会済みユーザー
2021/04/20 22:01
2021/04/20 22:16
退会済みユーザー
2021/04/20 22:49
2021/04/20 22:51
退会済みユーザー
2021/04/20 22:53
退会済みユーザー
2021/04/20 22:55
退会済みユーザー
2021/04/20 23:01
退会済みユーザー
2021/04/20 23:19 編集
退会済みユーザー
2021/04/21 08:13
2021/04/21 08:29
退会済みユーザー
2021/04/21 08:36
2021/04/21 11:49
2021/04/21 11:57
退会済みユーザー
2021/04/21 12:55
退会済みユーザー
2021/04/21 12:57
2021/04/21 13:00
退会済みユーザー
2021/04/21 13:13
退会済みユーザー
2021/04/21 21:29
2021/04/22 00:21 編集
2021/04/22 02:45 編集
2021/04/22 09:47
2021/04/22 10:10
2021/04/22 10:57
2021/04/22 11:04
2021/04/22 11:24
2021/04/22 15:49 編集
退会済みユーザー
2021/04/22 20:35
0
デシジョンテーブル的な話であれば、こんな感じのテーブル定義しておいて、
table ぐるぐるまわして true になるものがあれば実行する、的な感じでしょうか
(PHP の書き方を忘れましたが、なんとなくのイメージが伝わることを期待して)
$table=[ {function($a,$b,$o){ return $a && $b && $o ? true : false }, function(){funcA()}}, {function($a,$b,$o){ return $a && ! $b && ! $o ? true : false }, function(){funcB()}}, {function($a,$b,$o){ return $a && $b && ! $o ? true : false }, function(){funcC()}}, ... ];
あるいは、下記のように全部文字列で持っておいて、よい感じでカンマで分割しつつ判定してもよいと思います。テストパータンが Excel 管理だったりして、Excel 更新後にコピペで反映したいとかいう場合はラクかと。
$table=<<EOM 1,1,1,funcA 1,0,0,funcB 1,1,0,funcC EOM
投稿2021/04/19 07:54
編集2021/04/19 07:59総合スコア2005
0
te2jiさんと、ほとんど変わらないけど。
そのままループで書いちゃダメなのかな・・・
php
1$json_data = '{ 2"attributes":{ 3"span": 1, 4"u":1, 5"s":0, 6"blockquote":1 7} 8}'; 9 10$d_json = json_decode($json_data,true); 11 12$ret = ""; 13// タグを内側から順に書くならreverseいらない 14$tags = array_reverse( array( 15 // 外側からネストしたい順にタグを記述 16 "blockquote", "span", "s", "u" 17) ); 18 19foreach ($tags as $t) { 20 if( $d_json["attributes"][$t] ) { 21 $ret = "<".$t.">".$ret."</".$t.">"; 22 } 23} 24echo $ret;
投稿2021/04/21 05:17
総合スコア4820
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/04/21 05:34
退会済みユーザー
2021/04/21 08:16
退会済みユーザー
2021/04/21 13:31
退会済みユーザー
2021/04/21 13:33 編集
退会済みユーザー
2021/04/21 13:35
2021/04/21 13:43
退会済みユーザー
2021/04/21 21:44 編集
2021/04/21 21:44
退会済みユーザー
2021/04/21 21:50 編集
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。