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

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

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

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

Q&A

解決済

4回答

1111閲覧

配列の中身の数字を計算し条件分岐

noricoonco

総合スコア19

PHP

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

0グッド

0クリップ

投稿2019/08/20 02:14

編集2019/08/20 02:15

タイトルわかりにくくて申し訳ありません。
人物のデータが配列に入力されています。

「score-(penalty✕5) = 30以下か以上か」を計算したく考えています。

php

1$user = array( 2 array('name' => '鈴木','score' => 60, 'penalty' => 5), 3 array('name' => '佐藤','score' => 30, 'penalty' => 4), 4 array('name' => '河原','score' => 40, 'penalty' => 0), 5 array('name' => '青木','score' => 70, 'penalty' => 2), 6);

考えている手順です↓↓
(1)penalty✕5を計算
(2)score−(1)を計算
(3)それぞれ30以下か計算

まずarray_columnでそれぞれ変数に代入しました。
(ここですでに考えとして間違っているのか?という感想です)

php

1$score = array_column($user, "score"); 2$name = array_column($user, "name"); 3$penalty = array_column($user, "penalty");

次に(1)penalty✕5を計算

php

1function kakeGo($n) { 2 return $n * 5; 3} 4$penalty2 = array_map('kakeGo', $penalty); 5 6これで配列が 7$penalty2 = (25,20,0,10) 8 9

(2)score−(1)を計算

php

1 2foreach ($score as $k => $v) { 3 if (array_key_exists($k, $penalty2) == TRUE) { 4 echo $v - $penalty2[$k]; 5 echo "<br>"; 6 } 7}

(3)それぞれ30以下か計算
ここで結果を出すのはどうやればいいのか混乱してしまいました。。
foreachで$resultを回しながらif文でしょうか?

アドバイスのほどよろしくお願いいたします。
また、やり方が適当でないなどアドバイス等もよろしくお願いいたします。

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

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

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

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

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

m.ts10806

2019/08/20 02:19

つまり、ついたペナルティによって減点したスコアを出したいということでよろしいでしょうか?
m.ts10806

2019/08/20 02:20

また30以下の場合はどうしたいのでしょうか?
noricoonco

2019/08/20 02:51

”$name”さんは”$score”点でクリアです というふうに出力できればと思っています。
noricoonco

2019/08/20 02:51

すみません回答漏れです。 >>つまり、ついたペナルティによって減点したスコアを出したいということでよろしいでしょうか? そのとおりでございます。
guest

回答4

0

$userforeachで回せないのでしょうか。

php

1foreach ($user as $value) { 2 echo "{$value->name} のscore-(penalty✕5)は {$value->score-$value->penalty*5}\n"; 3}

そうすると$scoreという変数を作る必要がなくなります。

また、$userは配列なので変数名は$usersの方が良いと思います。
配列を複数形にすることで、下記コードのように各要素に単数形を命名できます。

php

1foreach ($users as $user) { 2 echo "{$user->name} のscore-(penalty✕5)は {$user->score-$user->penalty*5}\n"; 3}

追記

30はクリア、29ではノークリアで考えております。
”$name”さんは”$score”点でクリアです

php

1foreach ($users as $user) { 2 $score = $user->score-$user->penalty*5; 3 if($score >= 30){ 4 echo "{$user->name}さんは{$score}点でクリアです\n"; 5 } 6}

投稿2019/08/20 02:19

編集2019/08/20 03:10
BluOxy

総合スコア2663

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

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

0

ベストアンサー

ちょーかんたんに書くとこんなかんじ?

PHP

1<?php 2$user = array( 3 array('name' => '鈴木','score' => 60, 'penalty' => 5), 4 array('name' => '佐藤','score' => 30, 'penalty' => 4), 5 array('name' => '河原','score' => 40, 'penalty' => 0), 6 array('name' => '青木','score' => 70, 'penalty' => 2), 7); 8foreach($user as $key => $val) { 9 $result = $val['score'] - $val['penalty'] * 5; 10 if ($result <= 30) { 11 echo $val['name'] . 'さんは30点以下です。点数:' . $result . "\n"; 12 } else { 13 echo $val['name'] . 'さんは30点より上です。点数:' . $result . "\n"; 14 } 15} 16?>

出力結果

鈴木さんは30点より上です。点数:35 佐藤さんは30点以下です。点数:10 河原さんは30点より上です。点数:40 青木さんは30点より上です。点数:60

投稿2019/08/20 02:35

編集2019/08/20 02:36
azuapricot

総合スコア2341

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

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

noricoonco

2019/08/20 03:57

みなさんのやり方それぞれやってみました、どれもとても参考になりました! 早さと一番シンプルだったのでベストアンサーとさせていただきます。
guest

0

PHP

1$user = [ 2 ['name' => '鈴木','score' => 60, 'penalty' => 5], 3 ['name' => '佐藤','score' => 30, 'penalty' => 4], 4 ['name' => '河原','score' => 40, 'penalty' => 0], 5 ['name' => '青木','score' => 70, 'penalty' => 2], 6 ]; 7 8$user=array_map(function($x){ 9 $x['is_under30']=($x['score']-$x['penalty']*5)<=30; 10 return $x; 11},$user); 12print_r($user);

投稿2019/08/20 02:34

yambejp

総合スコア114843

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

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

0

難しく考えすぎではないでしょうか。
それぞれを計算する関数を作っておき、通したら良いかなと思います。

php

1<?php 2define('PENALTY',5); 3define('REFERENCE_VALUE',30); 4 5function penaltyCalc(int $penalty = 0){ 6 return $penalty*PENALTY; 7} 8function finalScoreCalc(int $score = 0,int $penalty = 0){ 9 return $score - penaltyCalc($penalty); 10} 11function checkReferenceValue(int $score = 0,int $penalty = 0){ 12 return (finalScoreCalc($score,$penalty) >= REFERENCE_VALUE)?true:false; 13} 14 15 16$user = array( 17 array('name' => '鈴木','score' => 60, 'penalty' => 5), 18 array('name' => '佐藤','score' => 30, 'penalty' => 4), 19 array('name' => '河原','score' => 40, 'penalty' => 0), 20 array('name' => '青木','score' => 70, 'penalty' => 2), 21); 22 23foreach($user as $row){ 24 echo $row['name']."さん:"; 25 echo REFERENCE_VALUE; 26 echo (checkReferenceValue($row['score'],$row['penalty']))?'以上':'以下'; 27 echo PHP_EOL; 28}

Result

1鈴木さん:30以上 2佐藤さん:30以下 3河原さん:30以上 4青木さん:30以上

※内訳も表示したい場合

php

1 echo ' (内訳['; 2 echo 'スコア:'.$row['score'].' '; 3 echo 'ペナルティ:'.$row['penalty'].'('.penaltyCalc($row['penalty']).')'.' '; 4 echo '最終スコア:'.finalScoreCalc($row['score'],$row['penalty']).' '; 5 echo '])'; 6

投稿2019/08/20 02:33

編集2019/08/20 02:39
m.ts10806

総合スコア80850

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

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

yambejp

2019/08/20 02:40

できれば「以下」と「以上」は併記しないほうがよいですね 片方が「以下」ならもう片方は「より大きい」的な書き方がよいでしょう (未満と違って超過は浸透してないのでめんどくさい)
m.ts10806

2019/08/20 02:42

確かにそうですね。 「30以下か以上か」なのでそのまま持ってきたのですが、 ↑とか↓とかで「何となく伝える」でもいいかなと思いました。
m.ts10806

2019/08/20 02:49

判断基準が score < 30 なのか score <= 30なのか この質問内容では分からないですしね。30は「OK」なのかどうか
noricoonco

2019/08/20 02:53

判断基準が不透明で申し訳ありません。30はクリア、29ではノークリアで考えております。
m.ts10806

2019/08/20 02:56 編集

では score < 30 (または score >= 30)ですね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問