• 締切済み

PHPの関数をC#で再現したい

このジャンルでお願いします。 C# 2010 version 4.0を使用しています。 PHPという言語で isset( mixed $var [, mixed $... ] ) ・・・ 変数がセットされており、それが NULL でないことを調べる と array_key_exists ( mixed $key , array $search ) ・・・ 指定した key が配列に設定されている場合、 TRUE を返す という2つの関数がありますが、それぞれC#で同じような機能を再現しようとした場合に、 どのような記述やメソッドを使えば良いのでしょうか? 自分としては、C#のListを使って試しているのですが、 Listのメソッドにそれらしきものがなくて、 Countプロパティで指定したインデックス以下だったらと存在しない という無理なやり方しか思いきません・・・ if (list.Count <= indexKey) { /*存在しない*/ } 上の2つの機能をなんとかして再現することはできないでしょうか?

みんなの回答

回答No.1

・isset 厳密にisset相当は存在しません。 C#は ・変数の宣言が必須 ・変数の初期化が必須 (少なくともdefault(T),つまりは値型はnew T(),参照型はnullで初期化される) ため,「未定義」が存在しないためです。 で,値型 (structやenum,ほとんどのC#組み込み型) はnullになることがありません。 # 正確にはnull許容型というのがありますが,特殊な値型なので除外。 参照型 (classやdelegate, interface) はnullを設定することができます。 この場合,nullと比較することにより確認ができます。 ・array_key_exists これを使うと言うことは,おそらく連想配列として使っているのでしょうか。 そうであれば,List<T>よりもDictionary<TKey, TValue>を使うべきでしょう。 この場合,DictionaryのContainsKeyが使えます。 List<T>がよいのであれば,キーが何かを決めて,Existsメソッドで比較するか,Contains拡張メソッドで比較することになるでしょう。 # List<T>.ContainsはEqualsによる比較なので,常にキーで等しいとする場合を除いて使いにくいかと。 References) MSDN: Dictionary(TKey, TValue) クラス (System.Collections.Generic) http://msdn.microsoft.com/ja-jp/library/xfhwa508(v=vs.100) MSDN: Dictionary(TKey, TValue).ContainsKey メソッド (System.Collections.Generic) http://msdn.microsoft.com/ja-jp/library/kw5aaea4(v=vs.100) MSDN: List(T).Exists メソッド (System.Collections.Generic) http://msdn.microsoft.com/ja-jp/library/bfed8bca(v=vs.100) MSDN: Enumerable.Contains(TSource) メソッド (IEnumerable(TSource), TSource) (System.Linq) http://msdn.microsoft.com/ja-jp/library/bb352880(v=vs.100)

takagoo100
質問者

お礼

ご回答ありがとうございます。 このisset、array_key_existsの使い方については PHPのZend Frameworkというフレームワークの http://manual.zfdes.com/ja/zend.db.profiler.html http://ideone.com/JekM0d ┬ Zend │└ Db │ ├ Profiler │ │└ Query.php Query.phpというファイルのクラスZend_Db_Profiler_Query内のbindParamsメソッド の if (array_key_exists(0, $params)) { array_unshift($params, null); unset($params[0]); } の部分の処理です。 どうやらこの引数の$paramsは連想配列とただの配列、両方を 受け取ってるような気がするのですが、実際はどうなんでしょうか? すいません、自分としてはこのフレームワークのデータベース関係を ほとんどそのままC#で再現したいと思っているのですが、 それに関して新たに質問を立てるのもどうかなと思いますので ここでもう1つ質問に答えて頂けないでしょうか? 次の処理を見てもらいたいのですが、 class c { protected $a = 0; public function f(&$ii) { $this->a = &$ii; } public function p() { print $this->a . "\n";// 2と表示される } } $i = 1; $co = new c(); $co->f($i); $i = 2; $co->p(); このcクラスの$this->aは$iの参照を保持しているので、 $iが2に変わったら$this->aも2に変わります。 このような変数の参照を維持する仕組みはC#だと どのようにして実現できるのでしょうか? 自分なりにrefを使って試してみたのですが、 public class c { private int a = 0;//このメンバをなんとかして参照を保持できるようにできないか? public void f(ref int ii) { this.a = ii; } public void print() { Console.WriteLine(this.a);//1と表示される } } class Program { static void Main(string[] args) { c co = new c(); int i = 1; co.f(ref i); i = 2; co.print(); } } aがただのint型なのでiを2にしても1のままでした・・・ どうやらこのZend FrameworkのbindParamの処理も このような変数の参照を保持してSQLの実行時に 変数の中身を取得するような処理をしているらしいので なんとかこの機能を再現することはできないでしょうか?

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • PHPでrailsのbefore_filterを再現したいのですが

    初めまして。当方PHP初心者です。 標題の通り、PHPでrailsのbefore_filterのような機能を再現できないでしょうか。 要するにクラス内にAメソッド、Bメソッド、Cメソッド、Dメソッドが存在していて、 Bメソッド、Cメソッド、Dメソッドを実行する前に必ずAメソッドを実行させたいのです。 実現できる関数を探してみたのですが、どうにも見つかりませんでした。 皆様のお知恵を拝借したいです。 どうぞ、よろしくお願いします。

    • 締切済み
    • PHP
  • PHPを使ったPOSTについて教えてください。

    <body> <form action="" method="post"> <select id="list" name="list" > <option value="">選択してください</option> <option value="ichigo">いちご</option> <option value="orange">オレンジ</option> </select> <input type="text" size="30" id="word" name="word" > <input type="submit" value="検索"> </form> <?php $array = array(); $array['green'] = 'グリーン'; $array['red'] = 'レッド'; if (isset($_REQUEST['word'])) { $array ['key']=$_REQUEST['word']; } if (isset($_REQUEST['list'])) { $array ['List']=$_REQUEST['list']; } print_r($array); ?> </body> これを表示した場合、はじめのページでは Array ( [green] => グリーン [red] => レッド ) と表示されますが、フォームを実行すると、このように表示されます。 Array ( [green] => グリーン [red] => レッド [key] => [List] => ) これを、もしkeyやListの値が何も入力されなかった場合、listで言えば「選択してください」が選択されで実行された場合、[key] =>や [List] =>を表示しないと言うことはできますか? 例えばlistをデフォルトの「選択してください」のまま選択せず、テキスト欄に「テキスト」と入力したら、 Array ( [green] => グリーン [red] => レッド [key] => テキスト) とこのように[List] =>は省きたいです。 そのためにissetを使ったつもりでしたが、うまくいきませんでした。 どうしたら良いでしょうか?教えてください、よろしくお願いします。

    • 締切済み
    • PHP
  • メソッドの処理の意味

    PHP Version 5.3.1を使用しています。 Zend Frameworkというフレームワークを使用しているのですが、 http://manual.zfdes.com/ja/zend.db.profiler.html http://ideone.com/JekM0d ┬ Zend │└ Db │ ├ Profiler │ │└ Query.php Query.phpというファイルのクラスZend_Db_Profiler_Query内のbindParamsメソッド /** * @param array $param * @return void */ public function bindParams(array $params) { if (array_key_exists(0, $params)) { array_unshift($params, null); unset($params[0]); } foreach ($params as $param => $value) { $this->bindParam($param, $value); } } の if (array_key_exists(0, $params)) { array_unshift($params, null); unset($params[0]); } この部分は具体的に何をしている処理なのでしょうか? 配列内に数値の0があるかを調べて、 存在したらunshiftで先頭にnullを挿入する。 でもunsetでその挿入した行(インデックスが0なので)を削除する。 というふうに自分は解釈しているのですが、もしそれだと array_unshiftでnullの行を挿入する意味が分かりません・・・ そもそもなぜarray_key_existsで0があるかを調べる必要があるのでしょうか? できればこのメソッドの具体的な使用も含めてアドバイス頂けないでしょうか?

    • 締切済み
    • PHP
  • c# 要素と値

     こんにちは、c#初心者です。  細かいことなんですが、気にしだしたら止まらなくなって、遂に質問です。  配列などで、そのインデックスの位置に含まれているオブジェクトは”値”と呼ばれているところを見かけるのですが、List<T>などのコレクションでは”要素”と呼ばれているのを見かけます。  例えば、Array.IndexOfメソッドでは、XMLに「値を検索します」と書かれている上に、「T value」と値であることが明記してあります。  一方、List<T>のIndexOfメソッドでは、”要素”と書かれていて、「T item」となっています。  「配列の中身は値(value)、コレクションの中身は要素(item)と区別しているのか」と納得しかけていた矢先、Array.Exists 「指定された配列に、……”要素”が……」と配列でも要素という単語が使用されているじゃないですか!  もう訳が分かりません。確かに、値と要素なら大して意味の違いはないので読み手には問題ないですが、書き手にとってはどう使い分ければよいのかちんぷんかんぷんです。  どなたか使い分けの分かる人がいらっしゃいましたら教えていただけませんか?

  • PHPとSmartyの関連について

    PHPとSmartyの関連について PHPからSmartyに出力しているのですが中身がNULLになります。 データベースアクセスにはPDOを使用しています。 PHPソース DBアクセス $SQL = "select ITEM_ID from ITEM_TBL limit 0, 3"; $STMT = $GLOBALS["PDO"] -> query($SQL); $ROW = $STMT -> fetchAll(PDO::FETCH_ASSOC); Smartyでアサイン $smarty -> assign("ITEM_LIST", $ROW); Smartyソース <table> {{foreach from=$ITEM_LIST item=LIST}} <tr> <td>{{$LIST.ITEM_ID}}</td> </tr> {{/foreach}} </table> のような感じでページ出力したいのですが、表示をすると中身がNULLでした。 PHP側で var_dump($ROW); を行うと array(3) { [0]=> array(1) { ["ITEM_ID"]=> string(1) "1" } [1]=> array(1) { ["ITEM_ID"]=> string(1) "2" } [2]=> array(1) { ["ITEM_ID"]=> string(1) "3" } } 中身が配列で格納されています。 smarty側で {$ITEM_LIST|@var_dump} を行うと array(3) { [0]=> NULL [1]=> NULL [2]=> NULL } でした。 いろいろとやってみたのですが、わからなくなってしまったので どなたかご教授いただけませんでしょうか。よろしくお願いします。

    • 締切済み
    • PHP
  • Cの関数内ローカルstatic変数

    と同様の機能をJavaで実現したいのですが class Testclass { testmethod() { //////////////////////// //ここだけにしかコードを書けない //////////////////////// } } という条件で Testclass testclass=new Testclass(); が最初に生成された後他メソッド内で testclass.testmethod(); が実行されるたびに 1カウントアップする変数countを作成することはできるでしょうか? 上のように1つのメソッド内だけしかコーディングできません Cならば static int count=0; count++; を記述すれば片付くのですが Javaの場合はメソッド外に記述しない限りできないのでしょうか?

    • ベストアンサー
    • Java
  • スカラー変数をチェック

    こんにちは。 スカラー変数にデータがあるかどうかを調べるには、 どうしたらよいのでしょうか? NULLや""ではなく、存在そのものを調べたいのです。 スカラー変数を対象にしたexists関数のようなものはありませんか? PHPのisset()のような関数です。

    • ベストアンサー
    • Perl
  • phpのページが白紙で表示される

    phpのページが白紙で表示される phpでメールフォームを作成しています。 フォーム画面から確認画面に遷移すると ページが白紙で表示されてしまい困っています。 生成されたページのソースをブラウザで見ても 何も書かれておらず、本当に白紙の状態です。 <html>より前に書いたソースに問題がありそうですが 理由がわかりません。 どなたか解決策にお心当たりございましたらお願いいたします。 以下問題のページ<html>までのソース ———————————————————— <?php function checkInput($var) { if (is_array($var)) { return array_map('checkInput', $var); } else { if (get_magic_quotes_gpc()) { $var = stripslashes($var); } if (preg_match('/¥0/', $var)) { die('不正な入力です'); } if (!mb_check_encoding($var, 'UTF-8')) { die('不正な入力です'); } return $var; } } session_start(); $_POST = checkInput($_POST); $sei = isset($_POST['sei']) ? $_POST['sei'] :NULL; $mei = isset($_POST['mei']) ? $_POST['mei'] :NULL; $address = isset($_POST['address']) ? $_POST['address'] :NULL; $email = isset($_POST['email']) ? $_POST['email'] :NULL; $error = array(); if (trim($sei) == '') { $error[] = '必須項目です'; } else if (mb_strlen($sei) > 10) { $error[] = '10文字以内でお願いいたします'; } if (trim($mei) == '') { $error[] = '必須項目です'; } else if (mb_strlen($mei) > 10) { $error[] = '10文字以内でお願いいたします'; } if (trim($address) == '') { $error[] = '必須項目です'; } else if (mb_strlen($address) > 100) { $error[] = '100文字以内でお願いいたします'; } if (trim($email) == '') { $error[] = '必須項目です'; } else { $pattern = '/^([a-z0-9¥+_¥-])(¥.[a-z0-9¥+_¥-]+)*@([a-z0-9¥-]+¥.)+[a-z]{2,6}$/iD'; if (!preg_match($pattern, $email)) { $error[] = 'メールアドレスの形式が正しくありません'; } $_SESSION['sei'] = $sei; $_SESSION['mei'] = $mei; $_SESSION['address'] = $address; $_SESSION['email'] = $email; $_SESSION['error'] = $error; if(count($error) > 0) { $dirname = dirname($_SERVER['SCRIPT_NAME']); $dirname - $dirname == DIRECTORY_SEPARATOR ? '' : $dirname; $uri = 'http://' . $_SERVER['SERVER_NAME'] . $dirname . '/present.php'; header('HTTP/1.1 303 See Other'); header('Location: ' . $uri); } else { ?> <html> ———————————————————— よろしくお願いいたします。

    • 締切済み
    • PHP
  • PhpMyAdminにおけるデータベース表示の不備

    個人でネットワークプログラミングを行うため、以下の環境を入れています。 ・PHP Version 5.2.4 ・MySql 5.0.45 ・phpMyAdmin - 2.11.5 ログインなどは出来たのですが、データベースを表示する画面になると以下のエラーメッセージが表示され、データベース一覧が表示できません。 ---------------------------------------------- エラーメッセージ: Warning: array_key_exists() [function.array-key-exists]: The second argument should be either an array or an object in [phpmyadminまでのパス]\phpMyAdmin\server_databases.php on line 172 Warning: array_key_exists() [function.array-key-exists]: The second argument should be either an array or an object in [phpmyadminまでのパス]\phpMyAdmin\server_databases.php on line 172 Warning: array_key_exists() [function.array-key-exists]: The second argument should be either an array or an object in [phpmyadminまでのパス]\phpMyAdmin\server_databases.php on line 172 Warning: array_key_exists() [function.array-key-exists]: The second argument should be either an array or an object in [phpmyadminまでのパス]\phpMyAdmin\server_databases.php on line 172 Warning: array_key_exists() [function.array-key-exists]: The second argument should be either an array or an object in [phpmyadminまでのパス]\phpMyAdmin\server_databases.php on line 172 Warning: array_key_exists() [function.array-key-exists]: The second argument should be either an array or an object in [phpmyadminまでのパス]\phpMyAdmin\server_databases.php on line 172 Warning: array_key_exists() [function.array-key-exists]: The second argument should be either an array or an object in [phpmyadminまでのパス]\phpMyAdmin\server_databases.php on line 172 合計: 1 Warning: array_key_exists() [function.array-key-exists]: The second argument should be either an array or an object in [phpmyadminまでのパス]\phpMyAdmin\server_databases.php on line 260 Warning: array_key_exists() [function.array-key-exists]: The second argument should be either an array or an object in [phpmyadminまでのパス]\phpMyAdmin\server_databases.php on line 260 Warning: array_key_exists() [function.array-key-exists]: The second argument should be either an array or an object in [phpmyadminまでのパス]\phpMyAdmin\server_databases.php on line 260 Warning: array_key_exists() [function.array-key-exists]: The second argument should be either an array or an object in [phpmyadminまでのパス]\phpMyAdmin\server_databases.php on line 260 Warning: array_key_exists() [function.array-key-exists]: The second argument should be either an array or an object in [phpmyadminまでのパス]\phpMyAdmin\server_databases.php on line 260 Warning: array_key_exists() [function.array-key-exists]: The second argument should be either an array or an object in [phpmyadminまでのパス]\phpMyAdmin\server_databases.php on line 260 Warning: array_key_exists() [function.array-key-exists]: The second argument should be either an array or an object in [phpmyadminまでのパス]\phpMyAdmin\server_databases.php on line 260 ---------------------------------------------- ソースを眺めていたところ、server_databases.phpにおけるarray_key_exists()で$stat_name, $first_databaseを引数に命令を行っているようですが、$first_databaseに値が設定されていない(=null)ためエラーが起こっているようでした(null避けによりエラーメッセージは出現しなくなった)。 しかし、$first_databaseにはデータベース一覧の情報が入るべきらしく、この値がnullということはありえません。つまり、データベース一覧を取ってこれていないのだろうと仮定したのですが、それ以降の対策が見つかりません。 かれこれ3時間程度迷いました。解決方法を知っている方は教えてください。どうかお願いします…。

  • array_mapの再帰処理がうまく行かない

    長文で失礼します。 array_mapでの再帰処理がうまく行かないのでどこが間違っているか教えてください。 まず、このような配列があります。配列の中に配列があります。 $ary = array(1, 2, null, array("a", null, "c")); この配列の中のnullを"なし"という文字列に変換したいです。 array_mapを使って再帰的にやってみました。 まずはうまく行ったコードから。 ------------------------------------------------------ $ary = array(1, 2, null, array("a", null, "c")); var_dump(null2Nashi($ary)); // nullを"なし"に置換する関数 function null2Nashi(  $in_array ){  if(is_array($in_array)){   return array_map("null2Nashi", $in_array);  } else {   if ($in_array === null){    $in_array = "なし";   }   return $in_array;  } } ------------------------------------------------------ 結果はnullが"なし"に変換されました array (size=4)  0 => int 1  1 => int 2  2 => string 'なし' (length=6)  3 =>   array (size=3)    0 => string 'a' (length=1)    1 => string 'なし' (length=6)    2 => string 'c' (length=1) そしてこの"なし"をコード内で指定するのではなく引数で指定したいと思って無名関数を使って以下のコードにしました。 ------------------------------------------------------ $ary = array(1, 2, null, array("a", null, "c")); var_dump(null2Str($ary, "なし")); // nullを指定文字列に置換する関数 function null2Str(  $in_array, // null値を含む配列  $in_str // null値を変換したい文字列 ){  $n = function($n_array) use($in_str){   if(is_array($n_array)){    return array_map($n, $n_array); //…(1)   } else {    if ($n_array === null){     $n_array = $in_str;    }    return $n_array;   }  };  return $n($in_array); } ------------------------------------------------------ 結果はnullは何も変換されませんでした。 array (size=4)  0 => int 1  1 => int 2  2 => null  3 =>   array (size=3)    0 => string 'a' (length=1)    1 => null    2 => string 'c' (length=1) どうやら(1)のarray_mapが動作していないようです。要素を分解せずに$nの無名関数に渡さずにそのまま第2引数を返しているだけみたいです。 何か対応方法があるでしょうか? どうぞよろしくお願い致します。

    • ベストアンサー
    • PHP