hack のためのネタ帳, etc,,,

×

switch

$x = 0;
switch($x) {
case "hoge": echo    "hoge"; break;
default    : echo "default"; break;    
}
結果は"hoge"である。

数値と文字列の比較時、数値として評価出来ない文字列は0と解釈される仕様。
文字列#文字列の数値への変換を参照。

switch("$x") と文字列化しとくと吉。

三項演算子

$x = 0;
echo $x == 0 ? 0 : $x == 1 ? 1 : 2;
結果は2である。

$x == 0 ? 0 : ($x == 1 ? 1 : 2);
ではなく
($x == 0 ? 0 : $x == 1) ? 1 : 2;
と解釈される仕様。
演算子の優先順位の「結合時の評価」に関する説明を参照。
gpc はともかく、何かの拍子に runtime とか sybase が On になった日には
fopen() で読んできたデータが(0x00→0x5c 0x30, 0x27→0x27 0x27 と)化けたり
そのあおりで Zend_Auth_Adapter_Openid や Zend_Http_Response が gzinflate() に失敗して
Warning: gzinflate() [function.gzinflate]: data error in /home/kou/local/lib/php/ZendFramework-1.10.5/library/Zend/Http/Response.php on line 609
とか、原因分かるまで泥沼な罠が待ってる。
PHP 5.3.0 で非推奨になって一安心。
つぅか、こんな機能捨てろよ。
お前らちゃんとマルチバイト対応しろよと orz
php at dogpoop dot cjb dot net 16-Nov-2002 04:01
を mb_string で書き換えて、quote も変えられるようにしてみた。
function mb_str_getcsv($line, $delim = ',', $quote = '"') {
  // based on http://www.php.net/manual/ja/function.fgetcsv.php#26886
  #$line: the csv line to be split
  #$delim: the delimiter to split by
  #$removeQuotes: if this is false, the quotation marks won't be removed from the fields
  $removeQuotes = true;
  $fields = array();
  $fldCount = 0;
  $inQuotes = false;
  for ($i = 0; $i < mb_strlen($line); $i++) {
    if (!isset($fields[$fldCount])) $fields[$fldCount] = "";
    $tmp = mb_substr($line, $i, mb_strlen($delim));
    if ($tmp === $delim && !$inQuotes) {
      $fldCount++;
      $i += mb_strlen($delim) - 1;
    } else if ($fields[$fldCount] == "" && mb_substr($line, $i, 1) == $quote && !$inQuotes) {
    if (!$removeQuotes) $fields[$fldCount] .= mb_substr($line, $i, 1);
      $inQuotes = true;
    } else if (mb_substr($line, $i, 1) == $quote) {
      if (mb_substr($line, $i+1, 1) == $quote) {
        $i++;
        $fields[$fldCount] .= mb_substr($line, $i, 1);
      } else {
        if (!$removeQuotes) $fields[$fldCount] .= mb_substr($line, $i, 1);
        $inQuotes = false;
      }
    } else {
      $fields[$fldCount] .= mb_substr($line, $i, 1);
    }
  }
  return $fields;
}
このままだとファイルからの読み込み時に改行含んだフィールドに対応が出来ないんだが、こういう基本的なルーチン自分で書かんにゃならんのは嫌だ。

関連

タグ

コメントをかく


「http://」を含む投稿は禁止されています。

利用規約をご確認のうえご記入下さい

Wiki内検索

フリーエリア

管理人/副管理人のみ編集できます