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

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

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

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

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

Q&A

解決済

2回答

1146閲覧

【PHPロジック】比較するキーの対象が動的に変わる配列同士の値の比較

SKSG

総合スコア19

PHP

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

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

0グッド

0クリップ

投稿2017/08/10 05:55

編集2017/08/10 05:57

配列Aと配列Bのvalueの値の比較の処理で、以下の条件で、
配列同士で比較する値のキーが変わる、というロジックを作っています。
比較条件が複雑で、例も見たことがなく、そもそものロジック組むのに苦戦しています。

** 条件1:配列Aの中の最大値を配列Bの値との比較対象とする **
** 条件2:もし配列Aの中で同じ値がある場合は「配列Bの値が大きい方を比較対象」とする **
** 条件3:さらに、もし配列Bの中で、比較対象の値と同じ値が複数ある場合は、「配列Bの"キー"中で一番小さい方を比較対象」とする **

【値の例1】 配列A 配列B array ( array( 1 => '2', 1 => '10' 2 => '5', 2 => '9' 3 => '4', 3 => '3' 4 => '8', 4 => '5' =>ここが比較対象(条件1にマッチ) 5 => '3', 5 => '0' 6 => '1', 6 => '5' ) ) ※配列Aの比較対象の値が配列Bの比較対象の値より大きいのでtrue 【値の例2】 配列A 配列B array ( array( 1 => '2', 1 => '10' 2 => '5', 2 => '9' =>ここが比較対象(条件2にマッチ) 3 => '5', 3 => '3' 4 => '3', 4 => '5' 5 => '5', 5 => '1' 6 => '0', 6 => '4' ) ) ※配列Aの比較対象の値が配列Bの比較対象の値より小さいのでfalse 【値の例3】 配列A 配列B array ( array( 1 => '10', 1 => '9' 2 => '10', 2 => '10' =>ここが比較対象(条件3にマッチ) 3 => '10', 3 => '10' 4 => '8', 4 => '12' 5 => '3', 5 => '0' 6 => '8', 6 => '12' ) ) ※配列Aの比較対象の値が配列Bの比較対象の値と同じはtrue 【値の例4】 配列A 配列B array ( array( 1 => '10', 1 => '9' 2 => '10', 2 => '10' 3 => '10', 3 => '10' 4 => '12', 4 => '12' =>ここが比較対象(条件3にマッチ) 5 => '12', 5 => '0' 6 => '12', 6 => '12' ) ) ※配列Aの比較対象の値が配列Bの比較対象の値と同じはtrue

この条件の比較ロジック、ロジック脳が足りなくて恐縮ですが解決法をご教授願えないでしょうか。
宜しくお願い致します。

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

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

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

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

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

guest

回答2

0

ベストアンサー

まず、あとあと比較した値自体や位置を使うのでなければ、「条件3」は不要かと思います。というのも、条件1・条件2で「AとBから抽出する、比較すべき値」は決まってしまいますので、それをどのキーから取得しようが、結果は同じだからです。

ということで、やるべき手順は、

  1. まず、Aの方から、最大値とそれが入っているキーのリストを抽出する
  2. Bについて、上で抽出したキーリストの値を調べて、Aの最大値より大きければfalse
  3. 最後まで調べて大きいのがなければtrue

という感じになります。

投稿2017/08/10 07:22

maisumakun

総合スコア145184

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

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

SKSG

2017/08/10 13:30

>> maisumakunさん 適切なコメントをいただいたおかげで不適切な判定のをしようとした点にも気づけて、 意図した処理も実装できそうです。ご回答、大変ありがとうございました。
anndonut

2017/08/10 13:44

maisumakunさん、sak71gさん ごめんなさい、答えらしきものを書いてしまいました。 でもロジックは人それぞれ、sak1gさんがベストだと思うロジックを書いてみてください。 コードは短ければいいというものではありません。 他の人にきちんと意図を伝えることも意識してみてください。
guest

0

とりあえず回答を書いてみました。
これを見て、ひらめきのスキルが上がるといいですね。
ロジックのスキルを上げるのであれば、Aizu Online Judgeの簡単な問題を解いてみて、
他の人の解答と見比べてみるといいかもしれませんね。

php

1<?php 2function startFromOne($ary) { 3 array_unshift($ary, 0); 4 unset($ary[0]); 5 return $ary; 6} 7$ex1a = startFromOne([2, 5, 4, 8, 3, 1]); 8$ex1b = startFromOne([10, 9, 3, 5, 0, 5]); 9$ex2a = startFromOne([2, 5, 5, 3, 5, 0]); 10$ex2b = startFromOne([10, 9, 3, 5, 1, 4]); 11$ex3a = startFromOne([10, 10, 10, 8, 3, 8]); 12$ex3b = startFromOne([9, 10, 10, 12, 0, 12]); 13$ex4a = startFromOne([10, 10, 10, 12, 12, 12]); 14$ex4b = startFromOne([9, 10, 10, 12, 0, 12]); 15 16// アドホックなやり方 17function compare($a, $b) { 18 $maxOfA = max($a); 19 $keysMatchedCondition1 = []; 20 foreach ($a as $key => $val) { 21 if ($val === $maxOfA) array_push($keysMatchedCondition1, $key); 22 } 23 echo '条件1に適合するキー: ', implode($keysMatchedCondition1, ', '), "\n"; 24 25 $maxOfB = $b[$keysMatchedCondition1[0]]; 26 foreach ($keysMatchedCondition1 as $key) { 27 if ($b[$key] > $maxOfB) $maxOfB = $b[$key]; 28 } 29 $keysMatchedCondition2 = []; 30 foreach($keysMatchedCondition1 as $key) { 31 if ($b[$key] === $maxOfB) array_push($keysMatchedCondition2, $key); 32 } 33 echo '条件2に適合するキー: ', implode($keysMatchedCondition2, ', '), "\n"; 34 35 $keyMatchedCondition3 = $keysMatchedCondition2[0]; 36 echo '条件3に適合するキー: ', $keyMatchedCondition3, "\n"; 37 38 if ($a[$keyMatchedCondition3] > $b[$keyMatchedCondition3]) 39 echo "配列Aのほうが大きい\n"; 40 else if ($a[$keyMatchedCondition3] < $b[$keyMatchedCondition3]) 41 echo "配列Bのほうが大きい\n"; 42 else 43 echo "配列Aと配列Bは等しい\n"; 44 45 return ($a[$keyMatchedCondition3] >= $b[$keyMatchedCondition3]); 46} 47 48// スマートなやり方 49function compare2($a, $b) { 50 $maxa = 0; 51 $maxb = 0; 52 foreach ($a as $key => $val) { 53 $maxa = $val; 54 $maxb = $b[$key]; 55 break; 56 } 57 foreach ($a as $key => $val) { 58 if ($val > $maxa) { 59 $maxa = $val; 60 $maxb = $b[$key]; 61 } else if ($val === $maxa && $b[$key] > $maxb) { 62 $maxb = $b[$key]; 63 } 64 } 65 return $maxa >= $maxb; 66} 67 68echo "[compare : アドホックなやり方]\n"; 69echo "値の例1\n"; 70var_dump(compare($ex1a, $ex1b)); 71echo "値の例2\n"; 72var_dump(compare($ex2a, $ex2b)); 73echo "値の例3\n"; 74var_dump(compare($ex3a, $ex3b)); 75echo "値の例4\n"; 76var_dump(compare($ex4a, $ex4b)); 77echo "[compare2 : スマートなやり方]\n"; 78echo "値の例1\n"; 79var_dump(compare2($ex1a, $ex1b)); 80echo "値の例2\n"; 81var_dump(compare2($ex2a, $ex2b)); 82echo "値の例3\n"; 83var_dump(compare2($ex3a, $ex3b)); 84echo "値の例4\n"; 85var_dump(compare2($ex4a, $ex4b)); 86?>

text

1[compare : アドホックなやり方] 2値の例1 3条件1に適合するキー: 4 4条件2に適合するキー: 4 5条件3に適合するキー: 4 6配列Aのほうが大きい 7bool(true) 8値の例2 9条件1に適合するキー: 2, 3, 5 10条件2に適合するキー: 2 11条件3に適合するキー: 2 12配列Bのほうが大きい 13bool(false) 14値の例3 15条件1に適合するキー: 1, 2, 3 16条件2に適合するキー: 2, 3 17条件3に適合するキー: 2 18配列Aと配列Bは等しい 19bool(true) 20値の例4 21条件1に適合するキー: 4, 5, 6 22条件2に適合するキー: 4, 6 23条件3に適合するキー: 4 24配列Aと配列Bは等しい 25bool(true) 26[compare2 : スマートなやり方] 27値の例1 28bool(true) 29値の例2 30bool(false) 31値の例3 32bool(true) 33値の例4 34bool(true)

投稿2017/08/10 13:37

anndonut

総合スコア667

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

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

SKSG

2017/08/12 05:21

>> anndonutさん 頂いた情報を三共にさせていただき、実行して動かしてうまく行けました。 ご丁寧にコード書いていて頂き有り難うございました。 大変感謝致します。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問