宜しくお願いいたします。

ユーザー定義関数からユーザ定義関数を呼び出す必要があり
以下の様にしてみたところ

function chk($value) {
   if ($value>0) {
      return TRUE;
   }
   return FALSE;
}
function test(){
   $a = 0;
   $b = -1;
   $c = 2;
   $txt = '';
   if (chk($a)) {
      $txt .= 'aはhoge<br>';
   }
   if (chk($b)) {
      $txt .= 'dはhoge<br>';
   }
   if (chk($c)) {
      $txt .= 'cはhoge<br>';
   }
   return $txt;
}

最初の chk($a) で処理が終わってしまいます。
この場合 chk() の return が test() をも止めてしまっているのでしょうか?

return で調べて見ると 呼び出し元のスクリプトに戻る というような解説だったので
test() に戻って処理の続きをしてくれる と思ったのですがうまくいきません。

これを return $txt; まで処理させるにはどのようにしたらよいでしょうか?

できれば chk() をTRUE、FALSEの判定に使いたいと思います。

何卒ご教授のほどよろしくおねがいします。

A 回答 (1件)

>最初の chk($a) で処理が終わってしまいます。



なにをもって終わっていると判断しているのでしょうか?
何も表示されないのは戻り値を表示してないだけかと。

print test();
すると「cはhoge」が表示されますね?
    • good
    • 0
この回答へのお礼

>何も表示されないのは戻り値を表示してないだけかと。

ご指摘ありがとうございます。
実際のプログラムでうっかりミスをやってました。

こんなアホな質問に答えていただき本当にありがとうございました。

お礼日時:2011/04/12 10:01

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qエクセルで種類を数える関数が無いのは何故?

エクセルで種類を数える関数が無いのは何故なんでしょうか?

エクセルで種類を数えるには、いくつかの関数を組み合わせるのが一般的ですよね?
直接数える関数が無いのは、訳があるんでしょうか?

Aベストアンサー

>>エクセルで種類を数える関数が無いのは何故なんでしょうか?

やっぱり、そういう関数が必要な方が全体からみたら少数派だと、エクセルの開発者たちが考えているからではないかと思います。
また、既存の関数を組み合わせたら、対処可能だから、無理して新しい関数を作る必要性もない、開発の優先順位が低いって判断もあるでしょうね。

私は、エクセルの表を作ったり、エクセルVBAでプログラムを作ったりしますけど、そういう関数が必要になったことが全くありませんし。

Qusort のユーザー定義比較関数の説明について

PHPマニュアルにあるusortの説明がうまく理解できなくて悩んでいます。
そこでは、パラメータとなる比較関数について次のように書かれています。

「比較関数は、最初の引数と二番目の引数の比較結果を返します。最初の引数のほうが二番目の引数より大きい場合は正の数を、二番目の引数と等しい場合はゼロを、そして二番目の引数より小さい場合は負の数を返す必要があります。」
http://php.net/manual/ja/function.usort.php

「usort() の例」として提示されているのは以下です。

function cmp($a, $b)
{
if ($a == $b) {
return 0;
}
return ($a < $b) ? -1 : 1;
}

$a = array(3, 2, 5, 6, 1);

usort($a, "cmp");


この例のユーザー定義の比較関数cmpは、前述の説明の通りに書かれているので理解できます。
しかし、ユーザーページの投稿にもありますが、($a > $b) としたり、($a < $b) ? 1 : -1 のように返り
値を変えて降順(逆順)にソートするという使い方を普通に見かけます。

これは、「最初の引数のほうが二番目の引数より大きい場合は正の数を(……)二番目の引数より小さい場合は負の数を返す必要があ」るという説明とは矛盾しています。
「必要」とまで書いているのでかなり強い指示だと思います。英語版でも「must」となっているので翻訳上の問題はなさそうです。

また、「配列のソート」ページによるとソート順は「ユーザー定義」とあり、件の比較関数次第ということになっています。
http://www.php.net/manual/ja/array.sorting.php

ということは、逆順であれ自然順であれ可能だとこれは示唆しているのだと思うのですが、やはり説明部分との矛盾が気になります。

……どう捉えたらよいのでしょうか?

PHPマニュアルにあるusortの説明がうまく理解できなくて悩んでいます。
そこでは、パラメータとなる比較関数について次のように書かれています。

「比較関数は、最初の引数と二番目の引数の比較結果を返します。最初の引数のほうが二番目の引数より大きい場合は正の数を、二番目の引数と等しい場合はゼロを、そして二番目の引数より小さい場合は負の数を返す必要があります。」
http://php.net/manual/ja/function.usort.php

「usort() の例」として提示されているのは以下です。

function cmp($a, $b)
{
i...続きを読む

Aベストアンサー

「最初の引数のほうが二番目の引数より大きい場合は正の数を(……)二番目の引数より小さい場合は負の数を返す必要がある」

「配列の中から任意に2要素$a,$b(但し$aの方がかならず左にある)を取り出したとき、$aと$bを入れ替える必要があれば正の数を、入れ替える必要が無ければ負の数を返す必要がある」

と置き換えて考えてください。
(実際には等しい場合は0を返したほうがソートの効率がよくなると思われます)

こちらのC言語のバブルソートのプログラムをご覧ください。
http://www1.cts.ne.jp/~clab/hsample/Sort/Sort1.html

if (x[j - 1] > x[j]) { /* 前の要素の方が大きかったら */

この行を

if (cmp_function(a, b)) { /* 前の要素の方が大きかったら */

に置き換えるのがusort関数と考えると分かりやすいですかね?
(実際にPHPが行っているのはバブルソートではなく、クイックソート・マージソートなどの併用ソートですが)

Qエクセルの関数で

エクセルの関数辞典を見ていたら、CUMPRINC関数というのがありました。
しかし、エクセルの「挿入」→「関数」→関数の分類で「財務」というのを選択したのですが、一覧表に載っていません。
どこに載っているのでしょうか?
どうすればこの関数を使えますか?
ちなみにシートの上でやっても関数の反応をしませんでした。

Aベストアンサー

Yahooで検索してみると、参考URLが引っかかりました。

参考になりませんか?

参考URL:http://money-sense.net/doc/20041215_224257.php

Qユーザー関数でのリソースを引数で処理

お世話になります。 今PHPの勉強をしております。
PHPでGDを使用した画像処理で同じような処理をさせる部分があるので
関数を作成して処理させたいと思っているのですが、引数でリソースを
渡して処理することは出来るのでしょうか。
試行錯誤しながら色々やってみましたがうまくいきませんでした。

$image_data = @imagecreatetruecolor($x, $y);
back_color_set($image_data);

function back_color_set($data)
{
/* この部分の処理は正常動作したソースをコピーしてきて編集 */
$back_color = imagecolorallocate($data,255,255,255);
imagefilledrectangle(data, 0, 0, $view_x, $view_y, $back_color);
}

所々省略しておりますが正常動作したソースを関数化しただけです。
宜しくお願いします。

Aベストアンサー

変数のデータ型の問題ではなく、通常の関数では、変数の中身を渡すだけなので、関数内でそれを書き換えても、元の変数の内容は変更されません。
これを変更可能にする方法が「リファレンス渡し」です。関数宣言の方を、リファレンスを受け取るように書き換えます。
php5以降なら、呼び側は、foo($var) で十分です。
function foo(&$var)
$var 変更
}
imagefilledrectangle などの関数はこの方法で作られています。

もう一つの方法は、関数の最後に変更したデータをreturn して、再度元の変数に代入します。
function change($im){
/*$im 変更 */
return $im;
}
$image = change($image);
文字列操作関数は、こちらの方法が多いです。

参考URL:http://php.benscom.com/manual/ja/language.references.pass.php

Qエクセルの関数 ネスト

エクセルの関数 ネスト

エクセルの関数で、ネストさせるときがあるとおもうのですが、

関数を内側に書いたらよいのか外側に書いたらよいのか分からなくなる時があります。

エクセルの関数に関してわかりやすく書いてあるページなどありますか。

Aベストアンサー

こんばんは

Excel2003までは、ネストが7まで、2007では64までが可能です。
http://www.google.co.jp/search?hl=ja&source=hp&q=excel+%E3%83%8D%E3%82%B9%E3%83%88%E3%80%802003%E3%80%802007&aq=f&aqi=&aql=&oq=&gs_rfai=

「仕様上は可能」でも、複雑なネストは間違いが生じやすいですし、変更もしにくくなります。「出来るだけネストはしない」「適宜、中間結果をセルに出力する」という方法を採った方が、間違いが少なく、柔軟性のあるシステムになると思います。

>エクセルの関数に関してわかりやすく書いてあるページなどありますか。
関数の個別の機能ならば、Webサイトも書籍も多数あるのですが、「組み合わせて使う」というのはその場その場での発想になってしまうと思います。

Qユーザー定義関数とクラスの違いとは?

間違えて違うカテゴリーに質問してしまったので、
そちらを削除して、質問させていただきます(レスも幸いなかったため)。

PHPを勉強して1ヶ月の初心者です。

ホームページを作ろうとして、本に書いてあったプログラムを元に、
付け足したり、削ったりしていました。
そして、プログラムが長くなってきたので、外部ファイルに処理を分割してみました。

どの本にも、「クラス」「オブジェクト指向」という言葉が強調されていたので、
とりあえずクラスにしてみました。
しかし、クラスの中で処理をした変数を取り出すのが手間に感じます
(クラス内では「$this->変数名」、クラス外では「$クラス名->変数名」と書く手間が・・・)。

本の中には、クラスを使わずに、
ユーザー定義関数のみのfunctionをまとめた外部ファイルを
作成している例が多い気がします。

そこで質問なのですが、
処理を分割して外部ファイルにするとき、
「メソッドをまとめたクラス」にした方がいいのでしょうか?
それとも、「ユーザー定義関数をまとめたもの」にした方がいいのでしょうか?

また、「こうゆう場合は、クラスにした方がいい」「ユーザー定義関数にした方がいい」などの
条件がありましたら、教えていただきたいです。

本やネットを調べても、使い分けについて書かれているページがなく、

今後の作成のためにも、ぜひ知っておきたいです。
すべてクラスにした方が今後よいようでしたら、全部クラスのままで作れるよう、
慣れていきたいとも思ってもいます。
よろしくお願いします。

間違えて違うカテゴリーに質問してしまったので、
そちらを削除して、質問させていただきます(レスも幸いなかったため)。

PHPを勉強して1ヶ月の初心者です。

ホームページを作ろうとして、本に書いてあったプログラムを元に、
付け足したり、削ったりしていました。
そして、プログラムが長くなってきたので、外部ファイルに処理を分割してみました。

どの本にも、「クラス」「オブジェクト指向」という言葉が強調されていたので、
とりあえずクラスにしてみました。
しかし、クラスの中で処理を...続きを読む

Aベストアンサー

この質問の回答は本1冊必要です。

共通のデータを持つ関数群を1つのクラスにする、
という考え方がいいでしょう。
つまり、グローバル変数を持ちたくなったらクラ
ス化を考える、ということです。

グローバル変数は、関数外の変数と捉えたらいい
でしょう。
複数の関数が同じデータを複数使い、引数でデー
タを渡すには煩雑すぎ、構造化(struct)で渡し
たくなったり、引数で渡さないで関数外の変数を
共通に使いたくなる場合です。

それらをクラスにまとめ、変数はクラス内のメン
バ変数にする訳です。

その意味、理由は説明する文字数が多過ぎて書け
ません。

Qエクセル関数の解読サイトなんてありますか?

エクセル関数の解読サイトなんてありますか?

いつもお世話になっております<(_ _)>

エクセルファイルに関数の入った数式が入力されています。
セルごとに複数の関数が入っていますが、私にはちっともわかりません。

そこで質問です。
こんなとき「エクセル関数を解読」してくれるようなサイトってありませんか?

たとえば検索窓があってそこに「=SUM(S1:S13)」わからなくて困っている関数式を入力。
すると答えの別ボックスに「S1~S13までの数値の合計」と出てくるようなサイト。

それに近いサイトでも良いので知っている方がいらっしゃればぜひ、教えてください<(_ _)>

Aベストアンサー

もし、

=IF(E14="","",IF(O14="",(IF(E14>"18:00"*1,"18:00",E14)-IF(C14<="8:00"*1,"8:00",C14))*24*1300,(IF(E14>"18:00"*1,"18:00",E14)-IF(C14<="8:00"*1,"8:00",C14))*24*1625))

だったら、どういう文章が出て欲しいのでしょうか?

もしE14が空白だったら、
 空白、
そうじゃなかったから、
 もしO14が空白だったら、
  (もしE14が18:00より大きかったら18:00、そうじゃなかったらE14)-(もしC14が8:00以下だったら8:00、そうじゃなかったらC14)×24×1300
 そうじゃなかったら、
  (もしE14が18:00より大きかったら18:00、そうじゃなかったらE14)-(もしC14が8:00以下だったら8:00、そうじゃなかったらC14)×24×1625

って感じですか?
数式をそのまま読解したほうが解りやすくないですか?

Qユーザー定義関数について

ユーザー定義関数について悩んでます。

ソースファイル
<?php
$search_key1= addslashes($_POST['chokusetsu']);
$search_key2= addslashes($_POST['yomi']);
$search_key3= addslashes($_POST['kakusuu']);
$search_key4= addslashes($_POST['busyu']);
print $search_key1;
//$search1にはきちんと値が入っている

require_once("mysql.php");// MySQLへのID・パスワードの取得をするファイルへのアクセス


function kensaku($str1,$str2,$str3,$str4){
$GLOBALS["mysql"] = new MySQL;
$GLOBALS["sql"] = "SELECT * FROM tankanji
WHERE
kanji like '%$str1%'
AND
(onyomi like '%$str2%'
OR
kunyomi like '%$str2%')
AND
kakusuu like '%$str3%'
AND
busyu like '%$str4%'";
}

// 検索条件を変数に代入してDB内を検索

kensaku($search_key1,$search_key2,$search_key3,$search_key4);
$mysql->query($sql);
?>


なんですが、ユーザー定義関数を用いてDB内部を検索しようとしているのですが、$search_key1,$search_key2,$search_key3,$search_key4の値がうまく関数の中で使われなくて悩んでいます。グローバル関数とやらも自分なりには試しましたが、解決しませんでした。

ようは
$search_key1= addslashes($_POST['chokusetsu']);
$search_key2= addslashes($_POST['yomi']);
$search_key3= addslashes($_POST['kakusuu']);
$search_key4= addslashes($_POST['busyu']);

の$search_key1,$search_key2,$search_key3,$search_key4を$str1,$str2,$str3,$str4に各々代入してsql文を発行しようとしてますが、うまくいかないのです。


どなたか、原因がわかる方いらっしゃるでようか??

ユーザー定義関数について悩んでます。

ソースファイル
<?php
$search_key1= addslashes($_POST['chokusetsu']);
$search_key2= addslashes($_POST['yomi']);
$search_key3= addslashes($_POST['kakusuu']);
$search_key4= addslashes($_POST['busyu']);
print $search_key1;
//$search1にはきちんと値が入っている

require_once("mysql.php");// MySQLへのID・パスワードの取得をするファイルへのアクセス


function kensaku($str1,$str2,$str3,$str4){
$GLOBALS["mysql"] = new MySQL;
$GL...続きを読む

Aベストアンサー

確かに構成がちょっと気持ち悪いですねw
MySQLってクラスを上手く使った方がいいとは思いますが、
中がどうなっているのかよく分かりません。
addslashesじゃなくて専用のエスケープ処理はその中に入ってないんでしょうか。
<?php //参考に

$values = $_POST;
$rows = search_kanji($values);
print '<table>';
foreach ($rows as $row) {
 print '<tr><td>' . $row['kunyomi'] . '<td></tr>';
}
print '</table>';

funtion search_kanji($values) {
 $db = new MySQL();
 $sql = 'SELECT * FROM ...';
 $rs = $db->query($sql);
 $rows = array();
while ($row = $db->fetch()) { // ?
  $rows[] = $row;
 }
 return $rows;
}

確かに構成がちょっと気持ち悪いですねw
MySQLってクラスを上手く使った方がいいとは思いますが、
中がどうなっているのかよく分かりません。
addslashesじゃなくて専用のエスケープ処理はその中に入ってないんでしょうか。
<?php //参考に

$values = $_POST;
$rows = search_kanji($values);
print '<table>';
foreach ($rows as $row) {
 print '<tr><td>' . $row['kunyomi'] . '<td></tr>';
}
print '</table>';

funtion search_kanji($values) {
 $db = new MySQL();
 $sql = 'SELECT *...続きを読む

Qエクセル関数を、書き写して分析できるツールはある?

タイトルの件、質問します。

エクセルの関数を分析する際に、エクセルの数式バーや、セルに入っている関数を
F2を教えて見るのでは、見にくい場合があります。

現在は、私は、メモ帳に関数をコピーして、分析したり、修正したりしています。
エクセルの機能or他ソフトで、関数を分析できるツールはあるのでしょうか??

【エクセルバージョン】
2003、2007

Aベストアンサー

難解な数式を理解したいとき,最も便利に利用できるのは,2003ではツールメニューのワークシート分析にある「数式の検証」です。
2007では数式タブにあります。

メンドクサイ数式のセルで数式の検証を使い,どの関数やどのカッコから計算が進んでいくのかを1ステップずつトレースして理解します。また意図しない結果がどの段階で発生しているのか追跡します。

このやり方は勿論間違った数式(意図しない結果が出てきた場合)を追跡するのにも使いますが,むしろ誰かに教わった「正しい数式」を理解する時に便利な方法です。
そもそも計算が通っていない(たとえばカッコの対応が間違えていて,Enterしても受け付けてくれないようなミスをしている場合)には使えません。



また,数式バーの中で数式の「中」にカーソルを入れて左右の矢印キーでカーソルを動かしていったときに,「(」や「)」をまたいだ瞬間に,対応する「閉じカッコ」「始まりのカッコ」が色つきで強調表示されるのを確認しながら,カッコの対応がまちがえてないかなどを調べるのも簡易な良い方法です。


あまり使わない方法ですが,数式の中で適宜ALT+Enterを打って「セル内改行」してしまい,数式を縦に分解して書いてみるのも整理しやすい方法のひとつです。

難解な数式を理解したいとき,最も便利に利用できるのは,2003ではツールメニューのワークシート分析にある「数式の検証」です。
2007では数式タブにあります。

メンドクサイ数式のセルで数式の検証を使い,どの関数やどのカッコから計算が進んでいくのかを1ステップずつトレースして理解します。また意図しない結果がどの段階で発生しているのか追跡します。

このやり方は勿論間違った数式(意図しない結果が出てきた場合)を追跡するのにも使いますが,むしろ誰かに教わった「正しい数式」を理解する時に便利...続きを読む

Q同一クラス内 関数内でユーザ定義関数でソート

class class_name
{
function sort_function($val1,$val2)
{ 並び替え関数 return 0or1or-1;}

function sousa()
{
$array=("山田","田中","砂糖");
uasort($array,$this->sort_function)
}
}

上のようなことをやろうとしているのですけれど
function sousa()を実行すると

---エラー----
Warning: uasort() [function.uasort]: Invalid comparison function. in XXXX.php on line XX
-------------

がでます。
クラス内関数を【並び替え用ユーザ定義関数】
として用いるにはどうしたらいいのでしょうか?
解決策をご存知の方がおられましたらご教授頂きたいです。
もちろん、関数をクラス内に配置しないか、
sousa関数内に並び替え関数を配置すれば正常に動作しますが
上のような配置で実行したいです。

よろしくお願いします。m(TT)m

class class_name
{
function sort_function($val1,$val2)
{ 並び替え関数 return 0or1or-1;}

function sousa()
{
$array=("山田","田中","砂糖");
uasort($array,$this->sort_function)
}
}

上のようなことをやろうとしているのですけれど
function sousa()を実行すると

---エラー----
Warning: uasort() [function.uasort]: Invalid comparison function. in XXXX.php on line XX
-------------

がでます。
クラス内関数を【並び替え用ユーザ定義関数】
として用い...続きを読む

Aベストアンサー

これでしょうかね
http://php.s3.to/man/function.call-user-func.html
引用「この関数のパラメータfunctionに array($classname, $methodname)を指定することにより、 クラスメソッドも静的にコールすることができます。」

試してないけど、内部callなら$classnameを$thisにすればいけるんでは??

参考URL:http://php.s3.to/man/function.call-user-func.html


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング

おすすめ情報