2010-11-18 12 views
0

次のコードでは、$counter変数はこの行のように整数を格納するために型キャストされています$counter=(int)fread($fp, 20);なぜstrlen($counter)が使用されます。つまり、strlenは文字列の長さを返しますが、$counterはすでに整数変数です。 substr($ counter、$ i、1)も同じです。プログラムは、私が上で説明したように理解していることだけです。PHPの基本 - 型キャストのジレンマ



$counter_file = "./count.txt"; 
$img_dir="./img"; 
if(!($fp=fopen($counter_file, "r"))) die ("Could not find $counter_file"); 
$counter=(int)fread($fp, 20); 
fclose($fp); 

$counter++; 

for ($i=0; $i<strlen($counter); $i++){ 

$img_src = $img_dir."/".substr($counter, $i,1).".jpg"; 
$img_tag_str .="<img src= \"$img_src\" border=\"0\">"; 

} 
echo "You are visitor no. $img_tag_str."; 

$fp=fopen($counter_file, "w"); 
fwrite($fp, $counter); 
fclose($fp); 

regrds、 seni。

+0

strlenはどこですか?私はあなたのコードでそれが表示されません。あなたのforループの周りに何かが途切れているように見える – wajiw

+0

私はそれを修正しました。 – appu

答えて

2

整数をstrlenメソッドに渡すと、この整数は文字列にキャストされます。

従ってstrlen(23)2となります。 strlen(1234)4となります。

なぜこれが必要なのですか?数字の桁数を知るなど。おそらくそれを行う最適な方法ではない場合でも。

これはサンプルコードで発生します。変数$counterがファイルからロードされます。整数へのキャストは、これが実数で、ランダムなものではないことを保証します1。次に、ループを使用してすべての桁を通過し、この桁の画像を表示します。それでなぜstrlensubstrの整数が必要なのかを説明します。


@ここでランダムなものが悪いのはなぜですか?あなたが数字を期待するとき、ファイルのデータが "Abc"であると想像してください。ループ意志の出力のようなもの:

<img src="img/A.jpg" alt="" /> 
<img src="img/b.jpg" alt="" /> 
<img src="img/c.jpg" alt="" /> 

あなたがA.jpgb.jpgまたはc.jpgを持っていないので、何も表示されません。

+0

+1 - PHPの美しさの1つは、すべてが本質的に文字の配列なので、この種のものにはどんなタイプでも試してみることができ、それを実現しようとします。また、$ counter [2]を使用して1234から3を返すこともできます。それはPHPです!それを解決する – Fenton

+0

です。 – appu

+0

@Sohnee:同意します。おそらく、サンプルコードの作成者はそれを認識していなかったでしょう。 –

1

$カウンタは整数ですが、文字列を必要とする特定の関数は、それを1として扱うことができます。 $ counter = 125の場合、strlen($ counter)はstrlen( '125')を見て3の正しい結果を返します。

この関数は渡された値を文字列としてキャストしますが、かわった。

1

$ counterはintにキャストされ、$ counter ++は単純な整数増分を行います。 strlen($ counter)のような関数は、文字列に$ count値を暗黙的にキャストしてから長さを返します。

+0

それはとても良かったです。コード内のsubstr関数のコンテキストでも説明しますか? – appu

+0

substr($ counter)はstrlen($ counter)と同じです - 文字列引数を必要とするほとんどの関数 - $ counterの値は暗黙的に文字列にキャスト –