2010年1月16日土曜日

mb_strposやmb_strlenで文字数がおかしかった(解決)

mb_strlen()などでマルチバイトの文字数がちゃんと計算されないので悩みました。
"utf-8"を引数で設定したらOKでしたが、面倒です。。

phpinfoで調べたら、php.iniで設定しているはずなのに、 mb関連がno-valueとか書いてありました。。

原因は、xamppの1.6.8を使っていて、php/php.iniを変更していたのがまずかったようで、apache/bin/php.iniの方を設定すれば直りました。。。

1.7.1からphpディレクトリ配下のphp.iniが生きるようになってるんですね。。。

2010年1月14日木曜日

session学習開始

sessionの学習を開始しました。

POSTとGETでは、あるページからあるページへのデータの受け渡しだけでしたが、
SESSIONを使うと、ブラウザを開いている間ずっと(設定すれば閉じたのちも)、データを保持して渡してゆける、というのはとても便利。

ありがたい仕組みです。。。

2010年1月7日木曜日

RGBテーブルその二

RGBのテーブルをまたつくりました。
サイトのバックグラウンドを作ろうとしています。

超コードがひよっこですが、ご照覧を。。。
(知り合いの方からsprintfを使えば、%xで16進数としてとれる、ということを教わりました。その方が断然簡単ですね!)



<html><head><style type="text/css"><!--table {font-size:0.8em;}-->
</style><body >
<?php
function deg2sixteen($deg){//10~15までをa~fに変換
    switch($deg){case 10:$deg="a";break;case 11:$deg="b";break;case 12:$deg="c";break;case 13:$deg="d";break;case 14:$deg="e";break;case 15:$deg="f";break;}//i switch end
    return $deg;}
echo "<table border='0' cellspacing='0' cellpadding='0'><tr>";//sell-paddingの値を0にする必要があった。
for($n=0;$n<4;$n++){//RGBそれぞれ2色ずつのテーブルをつくるループ
    echo"<td><table border='0' cellspacing='0' cellpadding='0'>";
        for($y=0;$y<16;$y++){//第一のカラーを0~15まで推移させる。
        echo"<tr>\n";
        if($n<2){$y2=15-$y;$yc=deg2sixteen($y2);}//この二行で上下を逆に。
        else{$yc=deg2sixteen($y);}
            for($x=0;$x<16;$x++){//第二のカラーを0~15まで推移させる。
                if($n%2==0){$xa=15-$x;$xc=deg2sixteen($xa);}//この二行で左右を逆に。
                else{$xc=deg2sixteen($x);}
                $y2=$yc."0";$x2=$xc."0";$z2="00";//ここで二ケタに変換
                switch($n){//ここでRGBから二色を選ぶ振り分け。
                    case 0:echo"<td bgcolor='#".$z2.$y2.$x2."'>#0".$yc.$xc."</td>\n";break;
                    case 1:echo"<td bgcolor='#".$x2.$y2.$z2."'>#0".$yc.$xc."</td>\n";break;
                    case 2:echo"<td bgcolor='#".$y2.$z2.$x2."'>#".$yc."0".$xc."</td>\n";break;
                    case 3:echo"<td bgcolor='#".$y2.$z2.$x2."'>#".$yc."0".$xc."</td>\n";break;
                }//$n switch end
            }//j for end
        echo"</tr>\n";
        }//i for end
    echo"</table></td>";
    if($n%2==1){echo"</tr><tr>";}
}//for n end
echo"</tr></table>";
echo "<table border='0' cellspacing='0' cellpadding='0'><tr>";//sell-paddingの値を0にする必要があった。
for($n=0;$n<4;$n++){//RGBそれぞれ2色ずつのテーブルをつくるループ
    echo"<td><table border='0' cellspacing='0' cellpadding='0'>";
        for($y=0;$y<16;$y++){//第一のカラーを0~15まで推移させる。
        echo"<tr>\n";
        if($n<2){$y2=15-$y;$yc=deg2sixteen($y2);}//この二行で上下を逆に。
        else{$yc=deg2sixteen($y);}
            for($x=0;$x<16;$x++){//第二のカラーを0~15まで推移させる。
                if($n%2==0){$xa=15-$x;$xc=deg2sixteen($xa);}//この二行で左右を逆に。
                else{$xc=deg2sixteen($x);}
                $y2=$yc."0";$x2=$xc."0";$z2="00";//ここで二ケタに変換
                switch($n){//ここでRGBから二色を選ぶ振り分け。
                    case 0:echo"<td bgcolor='#".$y2.$z2.$x2."'>#".$yc."0".$xc."</td>\n";break;
                    case 1:echo"<td bgcolor='#".$y2.$z2.$x2."'>#".$yc."0".$xc."</td>\n";break;
                    case 2:echo"<td bgcolor='#".$z2.$y2.$x2."'>#0".$yc.$xc."</td>\n";break;
                    case 3:echo"<td bgcolor='#".$z2.$y2.$x2."'>#0".$yc.$xc."</td>\n";break;
                }//$n switch end
            }//j for end
        echo"</tr>\n";
        }//i for end
    echo"</table></td>";
    if($n%2==1){echo"</tr><tr>";}
}//for n end
echo"</tr></table>";
?>
</body>
</html>

2010年1月6日水曜日

mb_convert_kana()で変換できなかった。("utf-8"が必要だった)

http://life1204.blogspot.com/2008/07/mbconvertkana.html

mb_convert_kana()で全角半角が変換できず悩んでいたら、上記のサイトを見つけ、無事解決。

第三引数に"utf-8"を入れてやればOKなんですね。
$str=mb_convert_kana($str,"an","utf-8");
みたいに。

全角文字、数字を、これで無事変換できるのはありがたい。。

2010年1月4日月曜日

RGBの色相をテーブル表示

RGBの色相階調を16進数表記させながらテーブルで表示させるプログラムを書いてみました。

最初、<td>のbgcolorの値に、”#F00”といった三桁の省略形で書いていたので、黒い背景になってしまい、しばし悩みました。6桁でちゃんと書かないといけないのですね。(ですので、画像にある3ケタ表示は簡略表示しているだけですのであしからず。)

なんか、簡単なプログラムでとても美しいものになったので、ちょっと嬉しくなって投稿してみました。
初心者なコードで笑われるかもしれませんが、一応コードもアップしておきます。

自己ログも兼ねまして。。

<?php

function deg2sixteen($deg){//10~15までをa~fに変換
    switch($deg){
        case 10:$deg="a";break;
        case 11:$deg="b";break;
        case 12:$deg="c";break;
        case 13:$deg="d";break;
        case 14:$deg="e";break;
        case 15:$deg="f";break;
    }//i switch end
    return $deg;
}
for($n=0;$n<3;$n++){//RGBそれぞれに色ずつのテーブルをつくるループ
switch($n){
    case 0:echo"赤Rと緑Gの混色図";break;
    case 1:echo"緑Gと青Bの混色図";break;
    case 2:echo"赤Rと青Bの混色図";break;
}

echo "<table border='0' cellspacing='0'>";
echo "<tr>";
for($i=0;$i<16;$i++){//第一のカラーを0~15まで推移させる。
    $ic=$i;
    $ic=deg2sixteen($ic);
    echo"<tr>";
    for($j=0;$j<16;$j++){//第二のカラーを0~15まで推移させる。
        $jc=$j;
        $jc=deg2sixteen($jc);
        $ic2=$ic.$ic;$jc2=$jc.$jc;$zero="00";//ここで二ケタに変換
switch($n){//ここでRGBから二色を選ぶ振り分け。
    case 0:echo"<td bgcolor='#".$ic2.$jc2.$zero."'>#".$ic.$jc."0</td>";break;
    case 1:echo"<td bgcolor='#".$zero.$ic2.$jc2."'>#0".$ic.$jc."</td>";break;
    case 2:echo"<td bgcolor='#".$ic2.$zero.$jc2."'>#".$ic."0".$jc."</td>";break;
    }//$n switch end
    }//j for end
    echo"</tr>";
}//i for end
echo"</table><br>";
}//for n end

?> 

■追記:deg2sixteen()という自前の関数を作って、
10~15までの数字をa~fまでの英字に返還させるようにしたのですが、
Fatal error: Can't redeclare already declared function
のエラーが最初出て困りました。
要するに関数を複数回宣言している、ということなので考えてみたら、
for文の中で宣言していました。。(^^;
for文の外で宣言してやると、無事いけました。

ああ、初心者(笑)

SIN,COSの使い道。(GDで円形に図形を配置)

GDを使って、複数の円を、円状に描きだす、ということの必要があって取り組みました。

「どうやったらx座標,y座標を割り当てていけるだろう?」としばし悩み、高校時代に挫折したsin,cosをふと思い出しました。
さっそく調べると、PHPにはsin(),cos()という便利な関数があり、ネットで少々勉強したら、かなり便利なものと判明。
高校時代の挫折は、sin,cosの使い道が分からないことに大きな原因があったんだな、としみじみ。。。
今回、sin,cosでY座標、X座標を取得したい、という理由がはっきりしていたので、

やっとsin,cosの使い道が分かりました(笑)。


色々試して、以下のようなコードで、実験作第一号は無事表示。
ありがたや。。

そういえば、deg2rad()関数が必須でした。数値の角度からラジアン値に変換してくれるすぐれもの。この関数でやっと、30度ずつ描画、といった均等配置が実現しました。ありがたや。。


<?php

    $r=100;
    $img = imagecreate(500, 500);
    $bg=imagecolorallocate($img,0,0,0);

for($i=0;$i<12;$i++){
   $rad=deg2rad($i*30-90);
    $c=$i*20+15;
    $c2=255-$c;
    $y=$r*sin($rad);
    $x=$r*cos($rad);
    $y2=$y+200;
    $x2=$x+200;    
    $col=imagecolorallocate($img, $c2,$c, 0);    
    imagefilledellipse($img, $x2, $y2, 20, 20, $col);
} 

    header("Content-Type: image/png");
    imagepng($img);

?>

GDで複数図形の描画でのつまづき

GDを使って、for文で複数の円を描画させようとしたら、一個しか描画されず悩みました。
理由は簡単でした。    imagepng($img); でPNG画像を排出する部分を、for文の中に入れていたからでした。。(^^;
複数の画像を描画するにしても、描きだすPNGファイルは一枚だけ、ということで、for文に入れ込んではいけませんでした。