Atsulabo
@Atsulabo (アツ)

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

array_walkとclouserを使うと正常な結果が出ない?

Q&A

Closed

解決したいこと

今日試験ですが、なぜか問題集のarray_walkとclouserを使った問題で意図通りの答えにならず
どこで間違っているのかがわからないのでご教授お願いしたいです。
ちなみにPJO-200 PHP5技術者認定上級試験問題集のp600にあるものです。

発生している問題・エラー

出力が315になるはずなのに下記の通り0を出力します

0

ログを見ると下記が出てます。

PHP Warning:  array_walk() expects parameter 2 to be a valid callback, no array or string given in /Applications/MAMP/htdocs/index.php on line 8

該当するソースコード

index.php
<?php
function getTotal($products,$tax){
  $total = 0;
  $callcack = function($price,$product_name) use ($tax_ratio,&$total){
                  $total = $price * (1.0 + $tax);
                  return $total;
              };
    array_walk($products,$callback);
    return $total;
}
$itemlist = array(
            'apple' => 100,
            'banana' => 200
          );
$tax_ratio = 0.05;
print getTotal($itemlist,$tax_ratio);
?>

自分で試したこと

つまりarray_walkで配列とかがないとかいわれてんですけど、上記の文法間違ってないのでなぜかわからず。。。
文法ミスがあるのかについては調べたんですが、問題ないという結果に。。。
半角スペースとかタブとかも大丈夫か調べたんですがなく、、、。
echoを入れたりしてて試しましたが、結果は同じでした。
簡単なarray_walkでも試しましたが、それはできるのに、なぜかこれだけ0になるんですよね。。。
上記の理屈はわかるので、試験はいけるんですが、なぜかうまく動かないので、何でだろう、と思って
質問させていただきました。
皆さんのお力をお借りしたいです。

0

4Answer

  • $callcack
    • typo
    • 呼び出し側では$callbackとなっている
  • $tax_ratio
    • getTotal関数では宣言されてない
  • callback関数にて、配列各要素の税込金額を計算しているだけ
    • 結局最後に代入された値が出力されるだけ。
    • 上記2つを修正すれば210となる
1Like

Comments

  1. @Atsulabo

    Questioner

    そうですね、すいません。ありがとうございます。そうですね。。でも問題集だと105+210=315になるようになってるらしいです。。。

書き直しました。
たいへんすみません。
ちなみに上級に落ちました。。。後200点弱が遠いですね。
(825点で準上級止まりでした)

書き直して再実行したら、@ktz_aliasさんのおっしゃるとおり
210でしたので、
そこに$total +=を書き加えると
315になりました。
お二方、ありがとうございました。
なお、修正した完成版を下記に書いておきます。

まさか変数名も間違っていたとは。。。
まだまだ修業が必要なようです。

index.php
<?php
function getTotal($products,$tax){
  $total = 0;
  $callback = function($price,$product_name) use ($tax,&$total){
                  $total += $price * (1.0 + $tax);
              };
    array_walk($products,$callback);
    return $total;
}
$itemlist = array(
            'apple' => 100,
            'banana' => 200
          );
$tax_ratio = 0.05;
print getTotal($itemlist,$tax_ratio);
?>
1Like
$callcack = function($price,$product_name) use ($tax_ratio,&$total){

詳細まで見ていないですが、変数名 $callcack が間違っているのが原因ではないでしょうか。

0Like

Comments

  1. @Atsulabo

    Questioner

    ありがとうございます。思いっきり間違ってました。。。

質問とは関係ないんですがclouserではなくクロージャ(closure)ですね。

0Like

Comments

  1. @Atsulabo

    Questioner

    おお!本当ですね。ありがとうございます!
    英語も勉強せねばですね(−_−;)

Your answer might help someone💌