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

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

ただいまの
回答率

88.78%

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

受付中

回答 2

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 392

norikr

score 10

前提・実現したいこと

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

現在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
    )

該当のソースコード

public function getBillCount(int $bill): ?array
    {
      $count_1 = $bill%5;
      $count_5 = floor(($bill%10)/5);
      $count_10 = floor(($bill%50)/10);
      $count_50 = floor(($bill%100)/50);
      $count_100 = floor(($bill%500)/100);
      $count_500 = floor(($bill%1000)/500);
      $count_1000 = floor(($bill%5000)/1000);
      $count_5000 = floor(($bill%10000)/5000);
      $count_10000 = floor($bill/10000);

      $num = array (
        "1" => $count_1,
        "5" => $count_5,
        "10" => $count_10,
        "50" => $count_50,
        "100" => $count_100,
        "500" => $count_500,
        "1000" => $count_1000,
        "5000" => $count_5000,
        "10000" => $count_10000,
       );

       return $num;
    }

    public function testGetBillCount_0枚有り()
    {
        if ($count_1=$count_5=$count_10=$count_50=$count_100=$count_500=$count_1000=$count_5000=$count_10000 !== 0) {
          $num = array (
            "1" => $count_1,
            "5" => $count_5,
            "10" => $count_10,
            "50" => $count_50,
            "100" => $count_100,
            "500" => $count_500,
            "1000" => $count_1000,
            "5000" => $count_5000,
            "10000" => $count_10000,
          );
        }

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

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • m.ts10806

    2019/04/12 14:19

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

    キャンセル

  • norikr

    2019/04/12 14:32

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

    キャンセル

回答 2

+2

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

<?php

// 入力された値から...?
// インプットがどういう仕様になっているかわからないのでとりあえず。
// 硬貨・紙幣ごとに枚数のインプットがあると仮定して。
$in_money = [
    '10'    => 10,
    '1'     => 10,
    '5'     => 10,
    '500'   => 10,
    '50'    => 0,
    '100'   => 10,
    '1000'  => 0,
    '10000' => 10,
    '5000'  => 10,
    '2000'  => 10,
];

// 金額から割り出せだったらめんどうだにゃー
// $in_coin = 1265489413;

$money_cnt1 = [];
$money_cnt2 = [];
foreach ($in_money as $money_key => $money_val) {
    // 枚数が0の場合は、配列に格納しないとあったので、キーを除外
    if ($money_val != 0) {
        $money_cnt1[$money_key] = $money_val;
    }

    // 0をいれなければいいというのであれば
    $money_cnt2[$money_key] = $money_val != 0 ? $money_val : null;
}

// 【また、配列には金額の小さいものから順に並んでいる必要がある。】
// keyの金額が小さい順なのか、値の金額が小さい順なのかわからないので、一旦keyの金額が小さい順と判断
if ($money_cnt1) {
    ksort($money_cnt1);
}
var_dump($money_cnt1);

// こっちはそのまま
var_dump($money_cnt2);

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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

+1

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じゃないとき」ならこう。

if ($count_1 !== 0
    && $count_5 !== 0
    && $count_10 !== 0
    && $count_50 !== 0
    && $count_100 !== 0
    && $count_500 !== 0
    && $count_1000 !== 0
    && $count_5000 !== 0
    && $count_10000 !== 0) {
    //処理
}

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

$count_1 = 10;
$count_5 = 10;
$count_10 = 10;
$count_50 = 10;
$count_100 = 10;
$count_500 = 10;
$count_1000 = 10;
$count_5000 = 10;
$count_10000 = 10;

$bills = ["1","5","10","50","100","500","1000","5000","10000"];

$result = [];
foreach($bills as $bill){
    if(isset(${"count_".$bill}) && ${"count_".$bill} !== 0){
        $result[$bill] = ${"count_".$bill};
    } 
}

var_dump($result);

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/04/12 18:06

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

    キャンセル

  • 2019/04/12 18:13

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

    キャンセル

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

  • ただいまの回答率 88.78%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る