質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

7回答

1053閲覧

総当たりのような条件分岐を管理しやすくする書き方

pegy

総合スコア243

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

1グッド

5クリップ

投稿2021/04/19 02:06

編集2021/04/20 13:52

【修正後】
※下記の【修正前】の質問内容が適当ではなかったため、事後的に本質問内容を加筆する形で修正しております。

以下のような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
K_3578👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tanat

2021/04/19 03:10

各処理は共通化できる処理がなく、個別に記述が必要と言う想定でしょうか?
takasima20

2021/04/19 04:03

条件が10コだと処理は3628800コになりますけど、そんなんほんとにつくるんスか?
m.ts10806

2021/04/19 04:07

仕様次第なのでこの例だけで有無は判断できません。処理内容が全部違うならそうするしかないでしょうけど
pegy

2021/04/19 04:34

皆様 コメントありがとうございます。 はい、今のところ処理はそれぞれ異なるという想定ですが、ご指摘の通り、結果としての処理をまとめることができるのか等について、出力される処理について、もう一度検討しようと思います。
K_3578

2021/04/19 08:51

なんか面白くなりそうな質問だ、気になるから高評価しときます。
退会済みユーザー

退会済みユーザー

2021/04/20 03:22 編集

相変わらず、質問者に対して質問してる奴らが一番頓珍漢な事言ってんなぁ…。
guest

回答7

0

めっちゃエスパー回答ですが、総当たりではなくてフラグ管理っぽいものを想定してませんか?
もしそうならビット演算を使ったフラグ処理 phpあたりで調査してみると良いかと。

古い記事しか見当たらなかったので、適当なのにリンク張っときますw
中身精査してません。
【PHP入門講座】 ビット演算 - @mpyw さん
PECL::BitSet - @rana_kualu さん

[PHP]ビット演算を使ったフラグ処理(2進数のビット操作)

投稿2021/04/19 04:36

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2021/04/19 05:54

おす! 高評価しといたぞ!
退会済みユーザー

退会済みユーザー

2021/04/19 08:48

役割間違ってるでしょ。 煽って、追加情報引き出しましょうよw
退会済みユーザー

退会済みユーザー

2021/04/19 10:23

だって、te2ji のやり方が一番効率いいじゃねぇか。 おらもよく使ってっぞ。
pegy

2021/04/20 02:14

コメントをいただき、ありがとうございます。sazi様のご回答にもあるように、結果的に「処理が分岐する」(これが避けられない)前提であるならば、どのように分岐させておくことが、後々見通しが良いのかということなのかと思います。その点において、結果的に行き着くのは2進数的な管理なのが共通なのかと思いますが、いろいろコメントを見ながら、分岐は見やすい、書きやすい、管理しやすいのですが、では例えば11100はどの条件がtrue(1)でどれがfalse(0)なんだっけということを確認しにいく必要があるというデメリットもあると気づかされました。一長一短ですが、ビット演算についても進数的な考え方についてご教示いただきありがとうございます。
退会済みユーザー

退会済みユーザー

2021/04/20 02:48

> ということを確認しにいく必要があるというデメリットもあると気づかされました。 それをデメリットと考えんなら、もう、プログラマ無理だぞ。おめぇ。 オラの場合は、 class BITS {  /**  * $idx で指定された番目のビットが 1 にセットされているか?  *  * @param int $value 検査する値  * @param int $idx 検査するビット番号  * @return bool  */  public static function isRaised(int $value, int $idx) : bool  {   return (検査式)? true : false;  } } って感じでbit演算専用のクラス作ってあっから $value = 0b00100101; var_dump(BITS::isRaised($value, 0)); bool(true) var_dump(BITS::isRaised($value, 1)); bool(false) var_dump(BITS::isRaised($value, 2)); bool(true) こんな感じになってっぞ。後はやること一緒だろ? おめぇ『bit演算って難しくて分かんないけど、“分かって考えたけど自分のケースには向いてなかった”って事にしちゃえ』って感じで『デメリットがある』ってごまかしただけだろ。 そんなんなら素直に『難しくてわかりませんでした』の方が、よっぽど失礼がねぇんじゃねぇか? まぁ、おめぇが成長しねぇのはおめぇの勝手だからオラが何か言うべき事でもねぇんだけんどもな。
退会済みユーザー

退会済みユーザー

2021/04/20 03:06

te2ji 以外、マトモな奴、一人も居ねぇってどうなってんだ。 こんなにレベル低かったか?
退会済みユーザー

退会済みユーザー

2021/04/20 03:12 編集

sazi もまぁ、正解か。 クロージャ使ったほうがいいかどうかは内容によるしなぁ…。
pegy

2021/04/20 03:45

goku59様 コメントを頂きありがとうございます。成長して新しいことができるようになりたいという気持ちは強いので、厳しいコメントを真摯に受け止め改善して参りたいと思います。さて、いただいたコメントで理解できなかった部分があるので、念のために確認させてください。 $value = 0b00100101 の場合2^8なので64通りの処理に分岐する例となろうかと思いますが、 実際に処理の分岐をする場合に、以下のようになる想定でしょうか?(ifとswitchいずれを使用するかは別つ問題としてですが) if($value === 0b00100101) { // 処理A } if($value === 0b00100100) { // 処理B } その点は、申し訳ございませんが、正直に私はわかりませんでした。 それとも(BITS::isRaised($value, 0)でそれぞれのビットの$idxを8桁分チェックして処理を分岐するのがイメージなのか、このbit演算を利用して処理をx通りに分ける最後の処理部分の妙を考えても、理解できずに、コメントさせていただきました。 至らずで申し訳ございませんが、よろしくお願い申し上げます。
退会済みユーザー

退会済みユーザー

2021/04/20 06:51 編集

んと、 1. ヒントを得たので、今現在はオラに聞きたい事はねぇって事か? 2. まだ何かオラに質問してぇって事か? どっちだ? あのな、多分、今のおめぇにはまだ分かんねぇと思うけんども、 少なくともこの件に関しては、 おめぇの質問に対して質問してる奴らも、回答してる奴らも、 おめぇが理想として思い描いているような正解って、誰も提示出来ねぇぞ。 ほとんど全てのプログラマって、非論理的だし非経済的だから『効率』ってのが一体何なのか、 全く分かってねぇからな。
pegy

2021/04/20 04:21 編集

コメントありがとうございます。 1.でございます。「聞きたいことはねえ」という不躾な言い方はするつもりはないです(笑)が見直すことで十分なヒントを得ることができました。 適切な回答が得られていないのであるとしたら、私の問いの方法や、整理の方法に問題があるケースの方が多く、自身が改善すべき点であると認識しております。 ””非経済的であるから『効率』ってのが一体何なのか、全く分かってねぇ という表現は、そういうものなのかー、という印象を受けましたが、 ””非論理的 という表現は、実務でバリバリ、プログラマとして活躍されている皆様の想像と真逆の印象だったので、とても意外でした。。メンテナンスといった管理を意識して常に論理的に最大効率を目指しているという印象おりました。脱線してしまい、申し訳ございません。
退会済みユーザー

退会済みユーザー

2021/04/20 04:36

そうかぁ。そしたら、自分で色々やってみる事だな。 この質問、結構いろんな要素が絡んでて 『書き方次第でメンテナンス性が天と地ほど開きが出る』という良い例の課題だかんな。 こういう質問を『おもしれぇ』と思えねぇ奴はまぁ、プログラマじゃなくて作業工なんだろ。
退会済みユーザー

退会済みユーザー

2021/04/20 10:56

要件が少し出てきたので回答を刷新しました。 *質問を修正した方が回答が付きやすいですよ。 新しい回答の方が、多分イメージにマッチしてんじゃないかなぁ。。。
退会済みユーザー

退会済みユーザー

2021/04/20 11:45

そうすっと、別の質問にした方がいいだろ。 明らかに、要件違うから。 タグを順番通りに入れ子にしてぇって話らしいじゃねぇか。
guest

0

分岐が増えたとして、どのみち分岐先の処理は作成しないと駄目なんでしょうから、変数の組み合わせが関数名になるようにして、可変関数として呼び出すというのはどうでしょうか。

可変関数は入り口として、実際の処理を呼び出すだけにすれば共通化もできるでしょうし。

投稿2021/04/19 09:09

sazi

総合スコア25173

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2021/04/19 09:18

一足先に FKM さんのとこでコード書いちゃったぜぃ
FKM

2021/04/19 09:34

method_exists関数は知らなかったです。かなり便利そうですね。
sazi

2021/04/19 14:39

phpは素人で単にアイデアだけですので、よしなに、ドーゾ。
pegy

2021/04/20 02:34

sazi様 コメントありがとうございます。FKM様、te2ji様の下記のコメントでおおよそ理解することができました。今回のパターンで是非実装してみようとおもいます。 さて、今回のケースですが、受け取るJSON形式の値で以下のような形式からHTMLを再構築する必要があるという案件でした。そこで以下の場合では<blockquote><span><u></u></span></blockquote>を作り出すということになるのですが、一応、タグの順番を守ってくださいという仕様のオーダーを受けているので、それぞれ細かく場合分けてして分岐させたかったという所が趣旨になります。 { "attributes":{ "span": 1, "u":1, "s":0; "blockquote":1; } } それであれば、同じ目的を達成するために、直接そのような形で質問すれば、そもそも他のやり方もあるんのではというご提案もあったかもしれませんが、複数の分岐パターンが出てしまうことを避けされないパターンがある場合には、普段実装されている皆さんであればどのようなコードを作成して管理しているのかというのも是非勉強させていただきたいとう希望もございました。 不親切、不適切な質問の仕方であれば、この場を借りて、お詫びいたします。 そして、皆様の多くのコメントについても合わせて御礼させていただきます。 よろしくお願い申し上げます。
68user

2021/04/20 06:14

> そこで以下の場合では<blockquote><span><u></u></span></blockquote>を作り出すということになるのですが、一応、タグの順番を守ってくださいという仕様のオーダーを受けているので、 HTML 的には span と u に親子関係の制約はないので、ここで言う順番というのはアプリ独自仕様ってことですよね。そこで分岐というのが出てくるのは何か違うような…。総当りでということを気にするような状況であれば、親子関係のパターンを定義して、それに従って生成するようなもののほうがよいような気がします。
sazi

2021/04/20 06:34

@pegyさん 私の回答の趣旨は、謂わばDIコンテナ的に考えて分岐を無くす事を考えてみてはという事です。
pegy

2021/04/20 07:16

@68user様 コメントありがとうございます。はい、まだ独自の仕様を完全に把握できているわけではないのですが、タグの構造を構築した上で属性をあてて行くことになるので、これらの順番が入れ替わってはいけないと解釈しています。ただ、パターンを解析してこれに逸脱しない方法など、違うアプローチもあろうかと思うので、少し落ち着いて、考えてみます。
pegy

2021/04/20 07:24

@sazi様 コメントありがとうございます。 DIコンテナ的については、まだ初心者で存じ上げず申し訳ございません。今少し調べ始めたのですが、すぐ読んでなるほど、という内容ではなさそうなため、時間をかけて理解してみます。
guest

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 2021  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
FKM

総合スコア3633

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2021/04/19 08:53

サンプルコードとして間違い箇所が多すぎる気がします。 あと、switch も嫌いなんで外してみましたw <?php //true or falseでトークンを作る $apple = true; // $apple = false; // $banana = true; $banana = false; $orange = false; $apple = $apple === true? 1:0; $banana = $banana === true? 1:0; $orange = $orange === true? 1:0; $token = "f".$apple.$banana.$orange; class Func { public $apple; public $banana; public $orange; public function __construct($apple,$banana,$orange){ } public function f000(){ echo 'f000'; } public function f100(){ echo 'f100'; } public function other_case(){ echo 'other_case'; } } $Func = new Func($apple,$banana,$orange); if(method_exists($Func, $token)){ $Func->$token(); } else { $Func->other_case(); }
pegy

2021/04/20 02:25

FKM様、te2ji様 ご回答いただきありがとうございます。まだまだ不慣れで、今朝から、可変関数やmethod_exists()の考え方をずっと調べていたのですが、まだ詳細にはわからない部分があるのですが、なんとなくコードから目指す方向はイメージできました。おそらく、2進数的な方法で判定しつつ、判定要素が増えることに対しても、上記のクラスで対応できるというところで便利なのかと推察いたしました。phpでクラス作りにはまだ不慣れですが、早速これを機会に実装してみようとおもいます。ありがとうございました。
退会済みユーザー

退会済みユーザー

2021/04/20 02:57

あのよぅ、te2ji の回答以外にねぇと思ってたから全然見てなかったんだけんどもよう、 おめぇの回答のコード、いろいろとメチャクチャ過ぎんなぁ。 そのやり方だと、後で確実にメンテナンスしてるやつ、死ぬぞ。 > 例えば変数が10個の総当たりのような場合には見通しや管理も困難なことになります。 って書いてあっけどどさぁ、100個とかに増えても、そのやり方で行くつもりか? きちぃだろ、どう考えても。
FKM

2021/04/20 06:59 編集

ケースバイケースです。10個と書いてるからこう答えたまでです。あと、単一のファイルでサンプルを書いていますが、自分が実装したケースでは別ファイル化してますし、コメントでインデックスも作成しています。 SAZI氏は評価しているようですが、自分の考えは全く同じです。method_existで判定しても、結局制御するのはクラス内のメソッドです。わざわざswitichを使ったのはクラスを別ファイル呼び出し前提(こうしないと、どのパターンが活用されているのかわからない)にしているからです。 他人がレベル低いとか、キャラのなりきりとか、そういう発言はこの場に全くふさわしくないですね。以前から貴方の発言は、公共性の高いナレッジスペースには不適切な、場の空気を読めない荒らし発言と受け取っていますので、信頼性も全く得られていないはずです。 波風立たないように、他の人が言わなかっただけだろうと思いますが。
退会済みユーザー

退会済みユーザー

2021/04/21 08:20

ちょっと直ってないなので指摘しときますね。 ・$banana, $orange が $apple == true? 0:1; となっている ・同じ個所の true? 0:1 は一般的に逆 true? 1:0 サンプルコードの該当箇所は修正しておいてください。
FKM

2021/04/22 02:23

ありがとうございます。確かにフラグは入れ替えるべきでしたね。 ちなみに自分が実装したやつではTとF(101の場合はfuncTFT)として使っています。
guest

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

FromMZ1500

総合スコア496

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

pegy

2021/04/20 02:18

コメントいただきありがとうございます。 例えば、$appleが単独でtrueかfalseではなく、複数の条件をすべて満たせば$appleにtrueを持たせるという意味で解釈いたしました。if(-else)は長くなる(またはネスト化)するほど、自分がまだまだ不慣れで見通しが聞かなくなるので、参考にさせていただきます。
guest

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

あのよぅ、SimpleXML 使ったら死ぬ病気かなんかなのか? おめぇ。
pegy

2021/04/20 13:33

te2ji様 コメントを頂きありがとうございます。 私が最も厄介であると思っていたのは、JSONの順番とタグの順番が必ずしも一致しない、具体的には上記の例にようにblockquoteがtrueの場合にはどの位置にあったとしても、必ず入れ子の中で最も外側に来るために、当初の質問として、全ての真偽だけではなく、どの要素に対する真偽値なのかを組み合わせとして、判定してパターン分けするという安易な発想に陥ってしまっていました。 implodeの中を見れば、その順番を常に固定して考えれば、あとはそれぞれの添字の要素が1か0かを判定すれば足りるので、添字の種類分だけ分岐すれば足りるということかと思います。 拙い点まで汲み取っていただきご回答を頂き誠にありがとうございます。
pegy

2021/04/20 13:55

te2ji様、goku59様 かような方法が適切かはわからないのですが、一旦汲み取っていただいた結果、解決したことから、 ①本文に本来の趣旨の内容の質問を加筆いたしました。 ②一方で、当初の質問内容を削除してしまうと、コメントのやり取りが事後的にご覧になられる方がわからなくなってしまうため、説明をふした上で残しました。 もちろん、goku59様のご案内にもあったように、全く別な物として新しく質問を立てるという方法もあろうかと思いますが、解決と過去の文脈を残すという意味で、このようなアプローチを採用してみました。 本件ご意見等があればお願いいたします。
pegy

2021/04/20 14:12

goku59様 率直にSimpleXMLを存じ上げません。このようなケースで利用できるかはわからないのですが、おそらく有効である故のコメントかと存じますので、調べてみます。
退会済みユーザー

退会済みユーザー

2021/04/20 22:01

> goku59 さん そうそうwそんな感じで煽ってろw > pegy さん > implodeの中を見れば、その順番を常に固定して考えれば、あとはそれぞれの添字の要素が1か0かを判定すれば足りるので、添字の種類分だけ分岐すれば足りるということかと思います。 はい。その認識で正しいです。 この回答は、「一つのフラグで <> と </> の 2 箇所を制御する方法が分からないって質問なのでは?」って観点で書きました。 *実際には、「出現箇所を固定したいが、固定方法が分からない」って質問だったようですが^^; (たまたまですが)不明点に合致した回答になっていたみたいで良かったです。 > SimpleXMLを存じ上げません。 SimpleXML を使用すると、構造化されたデータをより容易に構築することが出来ます。 今回の質問が、<> と </> を制御する方法が分からない。って内容だった場合 ・2箇所を一つのフラグで制御する方法の提示(私の回答) ・2箇所を制御するのではなく、一か所にまとめる方法(SimpleXML を使用した場合) と、回答コンセプトの違うコードになります。 私は前者を伝えたかったので回答の表現になっています。 *出現箇所を固定したいという問いに対しては、どちらも十分な回答になります。 SimpleXML を使用した回答をするつもりは無いので、goku59 さんが回答するのを待つか、ご自身で書いてみて確かめるかしてみてください。 まー goku59 さんにまともなコードを書かせるのはメンドイので、後者をオススメします。 > かような方法が適切かはわからないのですが~ 個人的には、追記情報は質問の後ろに「追記」として情報を追加していく方法がすでについている回答にロスが少なくなると思いますが、本件の修正方法でも問題ないかと思います。
Zuishin

2021/04/20 22:16

これなんで低評価なんだろう。implode が適当かどうかはともかく、今のところ唯一正しい解決法を示していると思います。goku59 絶賛のもう一つの回答は、情報が足りなかった時点でのエスパー回答なので結果的に的外れになっていますね。
退会済みユーザー

退会済みユーザー

2021/04/20 22:49

> これなんで低評価なんだろう そりゃおめぇ、元々が > 例えば変数が10個の総当たりのような場合には見通しや管理も困難なことになります。 って命題なんだから、そっから逸れた回答はダメだろ。 まず、開始タグと終了タグ個別に突っ込むとか、メンテ考えたら絶対にあり得ねぇだろ。 それに、今タグ4個だけんども、『10個に増えました』『やっぱり16個にしてください』『順番入れ替えて下さい』『このタグは複数回出てきます』とか言われたら、想像を絶する面倒くささだ。 現場、パニック起きんぞ。 だから、『低評価』。
Zuishin

2021/04/20 22:51

ああなるほど、君ね。評価が的外れなのも納得。
退会済みユーザー

退会済みユーザー

2021/04/20 22:53

> まー goku59 さんにまともなコードを書かせるのはメンドイので、後者をオススメします。 回答者にだけ見せられんなら、いくらでも書いてやるんだけんどもな。 世の中ってやつぁ、戦闘力3くれぇのくせに『オレはフリーザより強い』っ言い張るような奴、 結構いっぺぇいっからさぁ。 オラがここで回答書いちまうと、そいつら、修行しなくなんだろ? bit使った管理にしろ、SimpleXMLにしろ、ヒントは出してやったから後は修行次第だろ。
退会済みユーザー

退会済みユーザー

2021/04/20 22:55

へー。Zuishinも焼きが回ったなぁ。 まぁ、昔っからZuishinは知識はあっけど、実践知識となるとからっきしだったから仕方ねぇか。
退会済みユーザー

退会済みユーザー

2021/04/20 23:01

・jsonデータの順番でタグのネスト化が決定されるわけではない ・必ず、タグの順番は固定されている ってぇのは普通、『現時点での仕様』だかんな。 それをそのまま書くのは『コーダー』って奴だ。 その仕様がどう変わってもメンテナンス性が落ちねぇように書くのが、 プロの『エンジニア』の仕事なんだけんども、 Zuishinにしろ他の奴らにしろ、昔っから『コーダー』に毛が生えたような決め打ちのコードしか書けねぇからなぁ…。 その方が自分の仕事が減らねぇから都合が良いんだろうけんども、 そういうの、『マッチポンプ』って言うんじゃなかったか?
退会済みユーザー

退会済みユーザー

2021/04/20 23:19 編集

だいたい、このケースで implode() って、あり得ねぇぞ。 質問者の事馬鹿にすんのもてぇげぇにしといた方がいいぞ。 1. ポインタ代わりのキャラクタ入れて単純ループなり再帰なりで差し込んで行くか 2. 逆方向に回してconcatか 3. DOMオブジェクト使うか(SimpleXML) の、どれかだろ? 普通。 まじで、implode() 見た瞬間に目が点になったぞ、オラ。
退会済みユーザー

退会済みユーザー

2021/04/21 08:13

二人からの implode の評価がひどい ^^; この回答では3項演算子を使っていて、その評価箇所をシンプルに見せたかったので、配列の連結を使用してます。 文字連結だと echo 'hoge' . FALSE ? 'TRUE' : 'FALSE';//TRUE echo 'hoge' . (FALSE ? 'TRUE' : 'FALSE')//hogeFALSE; みたいに()つけなきゃいけなくなるので、気が散るかなぁと。
Zuishin

2021/04/21 08:29

私は implode が悪いとは言っていませんよ。 span などが四回ずつ出てくるところをもう少し工夫できそうな気がしたのと、XML を扱う良い方法があるかもとも思いましたが、そこは本題ではないので SimpleXML など特に言及しなくていいんじゃないかというつもりで書きました。
退会済みユーザー

退会済みユーザー

2021/04/21 08:36

括弧なんか、まじでどうでもいいだろ。おめぇら、何言ってんだ。 そもそもの質問の命題は 『例えば変数が10個の総当たりのような場合には見通しや管理も困難なことになります』 なんだから、 『どういうコードを書いたら、メンテナンス性が高くなるか?』 以外に答えなんかあるわけねぇだろ。 te2ji、おめぇ、例えばなんちゃってイケイケ系のWEB屋相手に そのコードこの先3年メンテナンスしてく自信あんのか?
FKM

2021/04/21 11:49

あなたはそんな受け答えで仕事してるんですか?そんなキャラになりきった、巫山戯た態度で
Zuishin

2021/04/21 11:57

この人はただの荒らしですよ。もう四~五回くらい BAN されています。
退会済みユーザー

退会済みユーザー

2021/04/21 12:55

> FKM 2021/04/21 20:49 > あなたはそんな受け答えで仕事してるんですか?そんなキャラになりきった、巫山戯た態度で え? まさか本当にそんな疑問持ってんのか? おめぇ。 おめぇ、もしかしてサンタクロース信じてんじゃねぇか? そんなわけねぇだろ。 おめぇらのレベルに合わせてると真面目に話すの疲れっから、こうしてるだけだぞ。 こうしてりゃ、『冗談』で済むだろ。お互いその方がいいじゃねぇか。
退会済みユーザー

退会済みユーザー

2021/04/21 12:57

『冗談』で済まずに、まじで頭沸騰して湯気立ててる奴が一人いっけどな。 まぁ、そいつは病気だから仕方ねぇだろ。
退会済みユーザー

退会済みユーザー

2021/04/21 13:13

あー、 > 例えば変数が10個の総当たりのような場合には見通しや管理も困難なことになります。 って心配してる質問に対してされた全部決め打ちのガッチガチのコード見て 『今のところ唯一正しい解決法を示していると思います』 って言っちゃうような奴はまぁ、そうするしかねぇだろうなぁ。 この質問に対する回答の何がすげぇって、 基本的に全員『振り分け処理に関する“関数”を一切定義しねぇ』んだもんな。 『こいつら、本当にプログラマか!?』 って思だろ、普通なら。 そっちの方が多数派って、どうなってんだ? teratailってって思うじゃねぇか。
退会済みユーザー

退会済みユーザー

2021/04/21 21:29

毎度いうけど、自分で回答書けよ。 この回答のコードは 「一つのフラグで <> と </> の 2 箇所を制御する方法が分からないって質問なのでは?」 って質問だととらえて、それを表現するための「コンセプトコード」。 「3年メンテナンス」するには情報が足りなさすぎるわ。 まー関数化に関しては、ON/OFF 部分を関数化した方が分かりやすかったね^^; 指摘の観点での関数化ではないけどw
FKM

2021/04/22 00:21 編集

やっぱり、無視でいいですね、こんな妨害行為をする人は。 運営に通報しておくのが一番適切だと判断したので、通報しておきました。
FKM

2021/04/22 02:45 編集

運営様からの回答が返ってきました。 件の人物はアカウント凍結対応となりました旨、ご報告致します。以下は運営様から頂いた内容です。 該当のユーザーに関しまして、複数の利用規約違反をおこなっているのが確認できましたため、凍結の対応と致しました。ご報告頂いてありがとうございました。
pegy

2021/04/22 09:47

私の問いが争いの呼び水になってしまい、申し訳ございません。そのような意図はなかっです。 また、どのような形にしても、時間を割いて頂き、コメントをくださっている皆様には心から感謝致します。
Zuishin

2021/04/22 10:10

いや、あの人は炎上させるためにコメントして低評価をつけまくっただけです。 たまたまこの質問がターゲットになっただけで、他には何もありません。 だから言っていることもむちゃくちゃだったでしょう。 もう何度も BAN されていますが、そのたびに新しいアカウントで復活して同じことをします。 「スコアを稼ぐのはこういう時に使うため」と公言し、復活直後はしばらくおとなしく回答しているのが特徴です。
pegy

2021/04/22 10:57

回答者のレベルにはまだまだ達する事ができない私にひとつ存じ上げない点があるのですが、スコアを獲得することや、ベストアンサーを得ることは具体的な利益が皆様にはあるのでしょうか? 善意でも利益であろうとも、解決した我々には感謝に耐えないのは変わりはないのですが、なぜ皆様が向学心や好奇心で時間を割いてくださるのか不思議でした。 本題から逸れてしまう為、ご放念頂いても構いません。
m.ts10806

2021/04/22 11:04

teatailタグのついた質問見てるとそういうのありますよ。探してみてください。
Zuishin

2021/04/22 11:24

「こういう時に使うため」がどういう意味かということなら、私にも全くわかりません。 彼の独自の考え方です。 スコアが高いほうが言うことに説得力が増すと思っているのかなと、ぼんやり想像しています。
pegy

2021/04/22 15:49 編集

有難うございます。関連タグを拝見いたしました。 実は私は全くプログラミングとは違う士業を営んでおり、直接エンジニアと関わった事がありません。 老後でも頭を使える趣味として、いい歳して初めてしまいました。 さて関連タグを検索し、yambejp様とかこれまでたくさん回答して下さっているコメントを拝見してこう言ったものを生業にしてる方は、思考や考え方が変わっている?または面白いなと率直に思いました。 もちろんプログラマやエンジニアを一様にタイプを分類することはできませんが、その独特な思考には感心してばかりです。 そういう点では、こういう結果になってしまいましたが、goku59様も興味深い思考だなとは思っていました。ルールはルールという事で残念です。 反感を買う発言であれば申し訳ございません。いずれにしても、この老体に活力を与えてくれるこのサービスと皆様には重ねて深謝でございます。
退会済みユーザー

退会済みユーザー

2021/04/22 20:35

私もエンジニアに転向して丸5年ですが、以前とは思考の方向性が変わったので、pegy さんが面白いと感じるのはよくわかります。 結構訓練による部分が大きいようです。 ・責任分界点を明確にしたがる ・用語定義を気にする あたりはかなり変化しました。 pegy さんもエンジニア業(?)に時間を割けば変わってくると思います。 goku59さんは、昔はちゃんと自身の意見を「具体性を持って」表現していたので面白い人だったんですが、最近はダメになっちゃいましたね。こちらがいくら振っても、コードや指摘箇所の具体的なところが全然出てこない。応対が無駄になってしまうので残念です。 まーほっとけば適当に復活するんで気にする必要もないです。
guest

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
68user

総合スコア2005

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

pegy

2021/04/20 02:26

コメントありがとうございます。仰っているイメージは受け取ることができました、ありがとうございます!
guest

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

momon-ga

総合スコア4820

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

pegy

2021/04/21 05:34

momon-ga様 コメントありがとうございます。 基本的な考え方はte2ji様と同じものかと理解いたしましたが、個人的には見え方も綺麗かなと印象を受けたりします。今並行して、simpleXMLで操作することにより実現することも調べているので、いろいろな視点で学んでみようと思っております。 ※といって、半日かけていったいDOMdocumentクラスを使うのとsimpleXMLを使うのと何が違うのだろう・・?と調べている段階なのでまだまだこれからです。
退会済みユーザー

退会済みユーザー

2021/04/21 08:16

親子だけなら良さそうですけど、兄弟が入ってくると多分しんどいですね。
退会済みユーザー

退会済みユーザー

2021/04/21 13:31

あのさぁ、頑張ってるとこ悪ぃんだけんども、 後出しで書くなら、せめて再利用のし易ぃ、メンテナンス性の高ぇ、もうちょっと品質の良いコードで回答してくんねぇかなぁ? > goku59 2021/04/21 08:12 編集 > だいたい、このケースで implode() って、あり得ねぇぞ。 > 質問者の事馬鹿にすんのもてぇげぇにしといた方がいいぞ。 > 1. ポインタ代わりのキャラクタ入れて単純ループなり再帰なりで差し込んで行くか > 2. 逆方向に回してconcatか > 3. DOMオブジェクト使うか(SimpleXML) > の、どれかだろ? 普通。
退会済みユーザー

退会済みユーザー

2021/04/21 13:33 編集

> 親子だけなら良さそうですけど、兄弟が入ってくると多分しんどいですね。 兄弟って、同階層だからさぁ、 どうして『しんどい』って発想になんのか、オラ、さっぱり分かんねぇよ。 いっしょに突っ込めばいいだけだろ。 兄弟それぞれの中になんか入ってくるってんなら、 そもそものJSONの構造からして明らかに違ってくるし、 そしたらもう、再帰するしかねぇから、 絶対に関数定義する必要出てくんだろ。 ほんと、勘弁してくんねぇかなぁ…。
退会済みユーザー

退会済みユーザー

2021/04/21 13:35

> goku59 2021/04/21 22:13 > この質問に対する回答の何がすげぇって、 > 基本的に全員『振り分け処理に関する“関数”を一切定義しねぇ』んだもんな。 > 『こいつら、本当にプログラマか!?』 > って思だろ、普通なら。
Zuishin

2021/04/21 13:43

あれだけ構ってやったのにまだ足りないのか。善意の回答者に迷惑かけるなよ。
退会済みユーザー

退会済みユーザー

2021/04/21 21:44 編集

こいつ、まだ頭沸いてんのか。水でもかぶってくりゃぁいいのに。 善意の回答者だろうが、おかしな事言ってりゃ、そりゃ、突っ込まれんだろ。 おらが向こうで『迷惑かけるな』って言ったのとおめぇの言ってる事は全く違うし、 おめぇ、論理破綻してるぞ。まじで頭でぇじょうぶか?
Zuishin

2021/04/21 21:44

構ってほしいなら迷惑のかからないところでやれと言ってるだけだろ。 お前の彼氏のところで構ってやるからそこ行け。
退会済みユーザー

退会済みユーザー

2021/04/21 21:50 編集

はぇー、2分かw だーめだ、このガイキチ。完全に狂ってるぞ。 朝っぱらからなにやってんだ、おめぇ。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問