質問するログイン新規登録

Q&A

解決済

2回答

1154閲覧

PHPで多次元配列にin_arrayを使用し、格納されていない文字列が入ったらエラー表示したい

wazowski_006

総合スコア23

PHP

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

0グッド

0クリップ

投稿2022/01/30 09:24

0

0

PHPを勉強中です。
達成させたい目標は多次元配列の中に一つでも指定された文字列が入った場合、
「エラー」とechoさせたいです。

例えば、

$box = [ ['color'=>'red', 'number'=>1], ['color'=>'blue', 'number'=>2], ['color'=>'yellow', 'number'=>3], ['color'=>'pink', 'number'=>4], ]; <!DOCTYPE html> <html lang= "ja"> <head> <meta charset="utf-8"> </head> <body> <section> <p><?php foreach($box as $iremono): ?><?=$iremono['color'].$iremono['number'] ?><?php endforeach; ?></p> <p><?=judge($box) ?></p> </section> </body> </html>

というようにHTMLと組み合わせて表示させます。
まず元々の$boxがあり、
'color'はred、blue、yellow、の3色のみしか入らない条件とします。
数字は1から10までしか入らない条件とします。
その中でもし、'color'にpinkを入れた場合、「エラー」とechoさせたいのです。

自分で行ったことは、
①まずユーザー定義関数を作ることにし'color'に色と'number'に数字を格納する

function judge($box) { $hako = array(); $colors = array('red', 'blue', 'yellow'); $numbers = range(1, 10); foreach($colors as $color){ foreach($numbers as $number){ $hako[] = array('color' => $color, 'number' => $number); } }

②その後、pink入っているときに「エラー」とechoする条件を記述
→ここで悩んでいます。

まず、else ifで行って、条件以外の色が入ったときechoすればいいかと思い、

if(in_array('red', array_column($box, 'color'))){ } else if(in_array('blue', array_column($box, 'color'))){ } else if(in_array('yellow', array_column($box, 'color'))){ } else { echo 'エラー'; }

→配列が表示されるだけで、何もechoされませんでした。

次は演算子を使用すればできるかと思い、以下の記述を行いました。

if (in_array(!'red', array_column($box, 'color')) && in_array(!'blue', array_column($box, 'color')) && in_array(!'yellow', array_column($box, 'color'))){ echo 'エラー'; }

→配列が表示されるだけで、何もechoされませんでした。
試しにすべての!を外してみたところ、「エラー」がechoされました。

次に、多次元配列なので、配列にそれぞれ0~4まで割り振られると思いました。
まず、redが一つでもあれば「合ってる」とechoさせて確認しようと思い、

for($i = 0; $i < 3; $i ++){ if(in_array('red', array_column($box[$i], 'color'))){ echo '合ってる'; } else { echo 'エラー'; } }

→エラーが3回表示されました。
もうここで限界を迎え、質問した次第です。

また、数字も1~10以外をが入った場合「エラー」echoしようと思い、

if(in_array(!range(1,10), array_column($box, 'number'))){ echo 'エラー'; } }

→「エラー」とechoされると思いましたが、何も表示されませんでした。

考え方の間違いでしょうか?
それとも最初のそれぞれcolorやnumberの格納の仕方が原因なのでしょうか?

検索の仕方や、アドバイスを頂けたらと思います。
よろしくお願いいたします。

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

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

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

guest

回答2

0

最終的にしたいことが理解しきれていないのですが、

こういうことなのかなと思います。

PHP

1<?php 2// Your code here! 3$box = [ 4 ['color'=>'red', 'number'=>1], 5 ['color'=>'blue', 'number'=>2], 6 ['color'=>'yellow', 'number'=>3], 7 ['color'=>'pink', 'number'=>4], 8]; 9 10judge($box); 11 12function isValidColor($color){ 13 return in_array($color,['blue','yellow','red']); 14} 15 16function judge($box){ 17 foreach($box as $value){ 18 if(!isValidColor($value['color'])){ //おそらくここの指定方法が分からなかったのでは? 19 die($value['color'] ."は不正な値です"); 20 } 21 } 22} 23

投稿2022/01/30 13:09

tanat

総合スコア18778

wazowski_006

2022/01/31 12:05

ご回答ありがとうございます。 今回は$colorに入れた色以外のものが$boxの中に入ってしまった場合、 「エラー」とechoしたかったので、die($value['color']."は不正な値です");の部分を、 echo 'エラー';とし、希望通り「エラー」をechoすることができました。 ユーザー定義関数でin_arrayを使ってcolorを格納する方法も初めて知ったので、 勉強になりました、ありがとうございます。 また、die関数も初めて見たのでこれから勉強させていただきます。
tanat

2022/02/01 16:42

うまく行ったようで良かったです。 die()は処理を全部止めるしか無いようなケースで使うものですね(今回は例示を単純化させる意図で使いました)
guest

0

ベストアンサー

逆じゃないかなあ

php

1$box = [ 2 ['color'=>'red', 'number'=>1], 3 ['color'=>'blue', 'number'=>2], 4 ['color'=>'yellow', 'number'=>3], 5 ['color'=>'pink', 'number'=>40], 6]; 7 8$colors = array('red', 'blue', 'yellow'); 9$numbers = range(1, 10); 10 11foreach (array_column($box, 'color') as $i=>$c) { 12 if (!in_array($c,$colors)) echo $i . ":" . $c . "\n"; 13} 14foreach (array_column($box, 'number') as $i=>$n) { 15 if (!in_array($n,$numbers)) echo $i . ":" . $n . "\n"; 16}

意図とちがうかもしれませんが…
--- 追記 ---
素直にやるならこうかなあ

php

1foreach ($box as $i=>$a) { 2 if (!in_array($a['color'],$colors)) echo $i . ":" . $a['color'] . "\n"; 3 if (!in_array($a['number'],$numbers)) echo $i . ":" . $a['number'] . "\n"; 4}

--- 追記 ---
コメントより

重複があるかどうかを判断するだけなら

php

1$ar = []; 2foreach ($box as $i=>$a) { 3 if (!in_array($a['color'],$colors)) echo $i . ":" . $a['color'] . "\n"; 4 if (!in_array($a['number'],$numbers)) echo $i . ":" . $a['number'] . "\n"; 5 $ar[] = $a['color'] . $a['number']; 6} 7if (count($a) > count(array_unique($ar))) { 8 echo "重複あり"; 9}

どれが重複してるかだしたいなら

php

1$ar = []; 2foreach ($box as $i=>$a) { 3 if (!in_array($a['color'],$colors)) echo $i . ":" . $a['color'] . "\n"; 4 if (!in_array($a['number'],$numbers)) echo $i . ":" . $a['number'] . "\n"; 5 $ar[] = $a['color'] . ',' . $a['number']; 6} 7foreach (array_count_values($ar) as $k=>$n) { 8 if($n > 1) { 9 [$color,$number] = explode(',',$k); 10 echo 'color=' . $color . " number=" . $number . " は重複しています。" 11 } 12}

投稿2022/01/30 12:43

編集2022/01/31 20:54
takasima20

総合スコア7468

wazowski_006

2022/01/31 12:20

ご回答ありがとうございます。 逆!そういうこともできるんですね! 多次元配列にin_arrayを使うには、array_columnを使うという例しか出てこなかったので、 こんな方法があるなんて驚きました! またforeachは$colors as $colorみたいなものしか使ったことも、 見たこともなかったので、その中にarray_columnを入れるなんて…まだまだ勉強が足りませんね…。 foreach ($box as $i =>$a)がどういう処理をされているのかわかりません…。 $boxを$aに置き換えるということでしょうか…??? 余談ですが、どういう勉強をしたらtakasima20さんのように書けるようになるのでしょうか…。 今回は$colorsに格納した色以外、$numbersに格納した数字以外が入った場合、 「エラー」とechoしたかったので、記述していただいたechoの部分を'エラー'と書き換えて、自分のしたいことができました! ありがとうございました! ただ、どの配列が格納した色・番号以外のものかechoする方法も勉強になりました。 ありがとうございます!
takasima20

2022/01/31 12:53

お役に立てたようでなによりです。(・∀・)b foreach (配列 as 値) {} で済むことが多いですが、連想配列とかだと foreach (配列 as キー=>値) {} てかんじで処理しますね。今回はただの配列なので foreach (配列 as インデックス=>値) {} となります。インデックスてのは 0,1,... てやつです。
wazowski_006

2022/01/31 15:16

ありがとうございます!とても勉強になりました! よく例ででてくる、 foreach $●● as $key => $valueというやつですね! こういう風に使っていくんですね…。 インデックスは配列のあの0から数えるやつですよね。 例えば今回の配列だと、redが入っているものが0で、blueが入っているものが1で…というやつですよね。 あともう一つ「エラー」とechoする条件に、 ・同じ色、同じ数字の配列があった場合 (例:$box = [ ['color' => 'red', 'number' =>1], ['color' => 'red', 'number' =>1] ]; のときに「エラー」とechoする) を追加しようと思うのですが、 その場合はカウント関数を使ったらいけるのか?と思ったのですが、 考え方的には合ってますでしょうか? 「php 連想配列 同じ配列」で調べたらそのようなことが出てきました。 カウントして同じものがあったら「エラー」とechoさせようと思いました。
wazowski_006

2022/02/01 14:52

追記ありがとうございます! 実現したいことができました!!すごすぎます! 例文(例えばforeachについて簡単に説明したサイトや、PHPの公式サイト)を見ても、 全く思いつかないのでまだまだですね…。 どうしたら思いつくようになるんでしょうか…。 本当にありがとうございました!
takasima20

2022/02/01 20:35

長くやってればそれなりに分かるようになりますよ。(o^-')b
wazowski_006

2022/02/03 06:10

ありがとうございます! がんばります!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.29%

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

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

質問する

関連した質問