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

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

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

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

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

2回答

1358閲覧

PHPで【0以外の整数のみ】配列に格納する方法を教えてください!

norikr

総合スコア10

PHP

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

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

1クリップ

投稿2019/04/12 05:15

編集2022/01/12 10:55

前提・実現したいこと

初心者です。初歩的な質問ですが調べてもよく分からなかったので質問させてください。

現在PHPの練習として以下の問題を解いているのですが、
0以外の整数のみ配列に格納するにはどうすればいいのでしょうか、、?

Q.
入力された値から、各硬貨・紙幣の枚数を配列に格納する。
配列の内容は、硬貨・紙幣の金額をKeyにして枚数を値にする。
枚数が0枚のものは、配列に格納しない。
また、配列には金額の小さいものから順に並んでいる必要がある。

発生している問題・エラーメッセージ

Failed asserting that two arrays are equal.
--- Expected
+++ Actual
@@ @@
Array (

  • 10000 => 99
  • 10000 => 99.0
  • 1 => 0
  • 5 => 0.0
  • 10 => 0.0
  • 50 => 0.0
  • 100 => 0.0
  • 500 => 0.0
  • 1000 => 0.0
  • 5000 => 0.0

)

該当のソースコード

php

1public function getBillCount(int $bill): ?array 2 { 3 $count_1 = $bill%5; 4 $count_5 = floor(($bill%10)/5); 5 $count_10 = floor(($bill%50)/10); 6 $count_50 = floor(($bill%100)/50); 7 $count_100 = floor(($bill%500)/100); 8 $count_500 = floor(($bill%1000)/500); 9 $count_1000 = floor(($bill%5000)/1000); 10 $count_5000 = floor(($bill%10000)/5000); 11 $count_10000 = floor($bill/10000); 12 13 $num = array ( 14 "1" => $count_1, 15 "5" => $count_5, 16 "10" => $count_10, 17 "50" => $count_50, 18 "100" => $count_100, 19 "500" => $count_500, 20 "1000" => $count_1000, 21 "5000" => $count_5000, 22 "10000" => $count_10000, 23 ); 24 25 return $num; 26 } 27 28 public function testGetBillCount_0枚有り() 29 { 30 if ($count_1=$count_5=$count_10=$count_50=$count_100=$count_500=$count_1000=$count_5000=$count_10000 !== 0) { 31 $num = array ( 32 "1" => $count_1, 33 "5" => $count_5, 34 "10" => $count_10, 35 "50" => $count_50, 36 "100" => $count_100, 37 "500" => $count_500, 38 "1000" => $count_1000, 39 "5000" => $count_5000, 40 "10000" => $count_10000, 41 ); 42 } 43

現在if文で**「0じゃないとき、格納する」**という意味合いで
このようなコードを書いています。

どうかご回答よろしくお願いします!!

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

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

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

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

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

m.ts10806

2019/04/12 05:19

コードはマークダウンのcode機能を利用してご提示ください。 というか、このif文意味が分からない作りになってます。
norikr

2019/04/12 05:32

ご指摘ありがとうございます。修正いたしました。
guest

回答2

0

mts10806さんが出されている内容で完結な気もしなくもないですが、入力がどういった形になっているか想像がつかないので、ご提示されているコードをガン無視して表現してみました。

php

1<?php 2 3// 入力された値から...? 4// インプットがどういう仕様になっているかわからないのでとりあえず。 5// 硬貨・紙幣ごとに枚数のインプットがあると仮定して。 6$in_money = [ 7 '10' => 10, 8 '1' => 10, 9 '5' => 10, 10 '500' => 10, 11 '50' => 0, 12 '100' => 10, 13 '1000' => 0, 14 '10000' => 10, 15 '5000' => 10, 16 '2000' => 10, 17]; 18 19// 金額から割り出せだったらめんどうだにゃー 20// $in_coin = 1265489413; 21 22$money_cnt1 = []; 23$money_cnt2 = []; 24foreach ($in_money as $money_key => $money_val) { 25 // 枚数が0の場合は、配列に格納しないとあったので、キーを除外 26 if ($money_val != 0) { 27 $money_cnt1[$money_key] = $money_val; 28 } 29 30 // 0をいれなければいいというのであれば 31 $money_cnt2[$money_key] = $money_val != 0 ? $money_val : null; 32} 33 34// 【また、配列には金額の小さいものから順に並んでいる必要がある。】 35// keyの金額が小さい順なのか、値の金額が小さい順なのかわからないので、一旦keyの金額が小さい順と判断 36if ($money_cnt1) { 37 ksort($money_cnt1); 38} 39var_dump($money_cnt1); 40 41// こっちはそのまま 42var_dump($money_cnt2);

一応動作するので、ご自身の環境で動かしてみてください。

投稿2019/04/12 10:35

編集2019/04/12 10:37
Bernadotte

総合スコア310

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

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

0

if ($count_1=$count_5=$count_10=$count_50=$count_100=$count_500=$count_1000=$count_5000=$count_10000 !== 0) {

ちょっとこのif文意味が分からないです。
メソッドにされてますが、testGetBillCount_0枚有り()には$count_1~$count_10000が未定義OR渡ってきてないのでエラーになります。

もう1つ1つ確認されたほうが良いです。読みづらいですし。

if整理するとして、「全部0じゃないとき」ならこう。

php

1if ($count_1 !== 0 2 && $count_5 !== 0 3 && $count_10 !== 0 4 && $count_50 !== 0 5 && $count_100 !== 0 6 && $count_500 !== 0 7 && $count_1000 !== 0 8 && $count_5000 !== 0 9 && $count_10000 !== 0) { 10 //処理 11}

「0じゃないものだけ」なら可変変数使うと簡潔に書けます

php

1$count_1 = 10; 2$count_5 = 10; 3$count_10 = 10; 4$count_50 = 10; 5$count_100 = 10; 6$count_500 = 10; 7$count_1000 = 10; 8$count_5000 = 10; 9$count_10000 = 10; 10 11$bills = ["1","5","10","50","100","500","1000","5000","10000"]; 12 13$result = []; 14foreach($bills as $bill){ 15 if(isset(${"count_".$bill}) && ${"count_".$bill} !== 0){ 16 $result[$bill] = ${"count_".$bill}; 17 } 18} 19 20var_dump($result);

投稿2019/04/12 05:48

m.ts10806

総合スコア80765

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

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

norikr

2019/04/12 09:06

なるほど!foreach文と掛け合わせればこれだけで簡潔に書けるのですね。 ありがとうございます。
m.ts10806

2019/04/12 09:13

それはそうなのですが仕様が不鮮明な部分がありこれが適切かどうかまでは現在の内容だけでは判断しかねる部分があり、とりあえず参考程度にと思ってます
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問