strlen関数で文字列の長さを取得する方法

このQ&Aのポイント
  • strlen関数を使用して文字列の長さを取得する方法について困っています。
  • プログラムの実行結果を見ると、$sumkey1変数が文字列ではなく数値として扱われているように見えます。
  • どうすれば正しい文字数を取得することができるでしょうか?
回答を見る
  • ベストアンサー

strlen関数について

文字列の長さがとれなくて困っています。 プログラムは、以下の通りです。 実行すると、1の箇所で66になります。 次に値の文字数(2の箇所)を出そうとすると、6と出てしまいます。 見ていると、$sumkey1を変数ではなく文字列として見入るみたいなのですが、 直前に、直接数字を代入するとちゃんとした値がとれます。 どうしたらよいか、わかる方いらしたら教えてください。 <?php $a= abcde12345678912345678912345678912; for($h=1; $h<5; $h++){ for($i=0; $i<8; $i++){ if($h == 1){ $sumkey1= $sumkey1 + hexdec(substr($a ,$i,1)) . "<br>"; }else if($h == 2){ $sumkey2= $sumkey2 + hexdec(substr($a ,$i+8,1)) . "<br>"; }else if($h == 3){ $sumkey3= $sumkey3 + hexdec(substr($a ,$i+16,1)) . "<br>"; }else if($h == 4){ $sumkey4= $sumkey4 + hexdec(substr($a ,$i+24,1)) . "<br>"; } } } //最初の8つを16から10進数にして足した値 echo $sumkey1 . "<br>"; //1 //文字列の長さ echo strlen($sumkey1). "<br>"; //2 //文字列? echo var_export(is_numeric($sumkey1), true); //3 ?>

  • koolm
  • お礼率80% (33/41)
  • PHP
  • 回答数1
  • ありがとう数2

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

<?php //おちつかないので配列使わせてください。 $sumkey = array(); $a= "abcde12345678912345678912345678912"; for($h=0; $h<6; $h++){ //都合上ここ変更 $sumkey[$h] = 0; for($i=0; $i<8; $i++){ //phpは //http://d.hatena.ne.jp/gallu/20061108/p1 //とかいう変態的な挙動をするので途中足される4文字は数値として解釈できないから //算術演算子+の引数の時に時に無視されて //普通に計算されているように見えるのです。 //計算結果66(2文字)の最後に文字列リテラルで"<br>"の4文字を足してたら6文字になるよな。 $sumkey[$h]= $sumkey[$h] + hexdec(substr($a ,8 * $h + $i ,1)) ; } } //まぁ別にsprintfしなくてもいいんですけどね。 echo sprintf("%d",$sumkey[0]) . "\n"; echo sprintf("%d",strlen(sprintf("%d",$sumkey[0]))); ?>

koolm
質問者

お礼

読みづらくて、すいません。m(__)m まだ始めたばかりで、構文側がわからなかったのでとりあえずで作っていました。 理解できました。 ありがとうございました。 見えるもの全てではないんですね。 勉強になりました。ありがとうございました。

関連するQ&A

  • 文字列分割方法

    フォームから入力されたデーターを文字数により4分割したい場合、 シングルバイトとマルチバイト文字列が混在していると、文字化けが起こってしまいます。 私が考えた方法は <?php $test="あああああいいいいいうううううえええええ"; $length = strlen($test); $length2 = (int)$length/4 $quarter[] = substr($test,0,$length2); $quarter[] = substr($test,$length2,$length2); $quarter[] = substr($test,$length2*2,$length2); $quarter[] = substr($test,$length2*3,$length2); echo $quarter[0]."<BR><BR>"; echo $quarter[1]."<BR><BR>"; echo $quarter[2]."<BR><BR>"; echo $quarter[3]."<BR><BR>"; ?> というものだったんですが、この場合$testに半角文字のaなどが入ると 文字化けしてしまいます。 上手く、マルチバイト・シングルバイト複合文字列を文字数により4分割する方法はないでしょうか? ご教授ください

    • ベストアンサー
    • PHP
  • PHPで文字列から数値に変換する方法について

    PHP5で数値の文字列から数値にする方法で質問です。 数値と認識されるものについては、そのまま、およびキャストするだけでそのまま使えると思いますが、 割り算(「/(スラッシュ)」)が入っているような計算式を数値として認識させる方法はありますでしょうか? 例えば $a="6861/2500"; echo (float)$a; echo "<br>"; とすると、先頭の6861という数値に変換されます。 if(is_numeric($a)){ echo "数値"; }else{ echo "文字"; } の結果は文字という判定になりました。 6861/2500 ↓ 2.7444 と取得したいです。 自分で計算記号から数値部分を区切って計算するような方法をとらないと難しいでしょうか?

    • ベストアンサー
    • PHP
  • 0をstringにできません。

    PHPで数字の0をstringとして扱えないようですが これは仕様でしょうか? ---------------------- echo("<br>数値として比較:"); $in=0; echo('<br>0の場合値は'); if($in==FALSE){echo('FALSE');} $in=1; echo('<br>1の場合値は'); if($in==TRUE){echo('TRUE');} echo("<br><br>文字列として比較:"); $in='0'; settype($in,"string"); echo('<br>"0"の場合値は'); if($in==FALSE){echo('FALSE');} $in='1'; settype($in,"string"); echo('<br>"1"の場合値は'); if($in==TRUE){echo('TRUE');} ---------------------- 上記コードを実行してみると ---------------------- 数値として比較: 0の場合値はFALSE 1の場合値はTRUE 文字列として比較: "0"の場合値はFALSE "1"の場合値はTRUE ---------------------- となって0がstringとして扱われてるのなら 文字列として比較した場合0でも1でもTRUEに なると思うのですが・・・

    • ベストアンサー
    • PHP
  • Fizz-Buzz問題のソース

    プログラミングの初心者です。 Fizz-Buzz問題をPHPで書いてみました。 <?php for ($i=1; $i<=100; $i++) { if ($i%3==0 && $i%5==0) { // 3でも5でも割り切れる数 echo "Fizz-Buzz"; } elseif ($i%3==0 && $i%5!==0) { // 3で割り切れる数 echo "Fizz<br>"; } elseif ($i%3!==0 && $i%5==0) { //5で割り切れる数 echo "Buzz<br>"; } else{ //3でも5でも割り切れない数 echo "$i<br>"; } } ?> こんな感じになったのですが、何か問題点はあるでしょうか? ちなみに、echo末尾に<br>を入れているのは、<br>なしで作ると、12Fizz4Buzz……と改行なしに表示されて読みにくかったからです。 インターネット上のソースを見ると、$i%3==0 && $i%5==0 ではなく $i%15==0 にしていたり、三項演算子を使ってバイト数を減らしたりと色々工夫がされているようですが、そちらのほうがよいのでしょうか。

    • 締切済み
    • PHP
  • PHPでのsubstr関数について

    PHPで、3問ほど質問です。 問1 PHPでプログラムを作成していて、思った結果が出てこないので、変数やら配列やらの 中身を表示させつつ、原因らしきものを突き止めました。 substr関数 です。 手元のプチリファレンスには、 substr(元の文字列,抽出開始位置,抽出する文字数) のようなことが書いてあるのですが、 抽出開始位置 ではなく、抽出を開始したい手前の位置 ではないのかと思いました。 というのも、 echo substr("abc",0,1); は、a が表示されますし、 echo substr("abc",3,1); は、何も表示されないからです。 というわけで、 substr(元の文字列,抽出を開始したい手前の位置,抽出する文字数) でいいのでしょうか? ○文字目から数えて、△文字分としたときにずれて表示されるので、ヘンだな~と 思っているのですが…。 問2 DOSプロンプト経由で、PEARをインストールしてみました。 (自分のパソコンです。XAMPPを使用しています) 最終的にinstall ok と表示されましたが、Warnning というメッセージがちらほらと。 大丈夫なんでしょうか? ただ、PEARの機能は使えましたが…。 問3 値を送る・返す関数ではなく、PHPで、サブルーチンというか、VBやVBAでいえば、Call文で 呼んでくるような、文の書き方を教えてください。 sub_keisan(); function sub_keisan(){ } のような引数なしの関数の書き方でいいのでしょうか?

    • ベストアンサー
    • PHP
  • 文字列の検索について

    こんにちわ。文字列の検索について質問があります。 ↓のコードは、 「$str という文字列の中に"<!>" という文字列が含まれていたら、その都度その位置を 知らせる」と意図したものです。 $str の中に "<!>" が3つ含まれていたら、3回それらの位置を知らせるはずです。 しかし、実際は、最後の $iの位置だけ出力されます。 どこに問題があるのでしょうか? よろしくお願いいたします。 -------コード(ココカラ)------- for ($i=1; $i<length; $i++) { $strsub=substr($str, $i, $i+2); if ($strsub == "<!>") { echo $i; echo "\r\n"; } } -------ココマデ-------

    • ベストアンサー
    • PHP
  • EXCEL VBAでセルの値が数値のときに2を掛ける方法について

    すいませんEXCEL VBAで教えていただきたいことがあります。 A1:H3000に数値及び文字列が入っている。 この範囲で値が数値のときは当該セルの値に*2の処理を行う (文字列の場合はそのまま) Dim i as Variant For Each i in Range("A1:H3000") IF ~ Next i というような流れでしょうか。 IFの後がテキスト本を見てもよくわかりませんでした。 よろしくお願いします。

  • デフォルトの定義済みクラスについて

    自分で定義したクラスの継承関係やらを出力するサンプルスクリプトがあったので、それをまる写しして動かしたところ、エラーがおこりました。以下のスクリプトがそれです。 <?php function get_methods($object){ $methods=get_class_methods(get_class($object)); if(get_parent_class($object)){ $parent_methods=get_class_methods(get_parent_class($object)); $methods=array_diff($methods,$parent_methods); } return $methods; } function get_inherited_methods($object){ $methods=get_class_methods(get_class($object)); if(get_parent_class($object)){ $parent_methods=get_class_methods(get_parent_class($object)); $methods=array_intersect($methods,$parent_methods); } return $methods; function get_lineage($object){ if(get_parent_class($object)){ $parent=get_parent_class($object); $parent_object=new $parent; $lineage=get_lineage($parent_object); $lineage[]=get_class($object); } else{ $lineage=array(get_class($object)); } return $lineage; } function get_child_classes($object){ $classes=get_declared_classes(); $children=array(); foreach($classes as $class){ if(substr($class,0,2)=='__'){ //ここに問題があるようです。 continue; } $child=new $class; //ここで「引数が無効」のエラーになります。 if(get_parent_class($child)==get_class($object)){ $children[]=$class; } } return $children; } function print_object_info($object){ $class=get_class($object); echo '<h2>クラス</h2>'; echo "<p>$class</p>"; echo '<h2>継承関係</h2>'; echo '<h3>親クラス</h3>'; $lineage=get_lineage($object); array_pop($lineage); echo count($lineage)?('<p>'.join(' -&gt; ',$lineage).'</p>'):'<i>None</i>'; echo '<h3>子クラス</h3>'; $children=get_child_classes($object); echo '<p>'.(count($children)?join(',',$children):'<i>None</i>').'</p>'; echo '<h2>メソッド</h2>'; $methods=get_class_methods($class); $object_methods=get_methods($object); if(!count($methods)){ echo "<i>なし</i><br/>"; } else{ echo '<p>継承しているメソッドは、<i>斜体</i>で表示します。</p>'; foreach($methods as $method){ echo in_array($method,$object_methods)?"<b>$method</b>();<br/>":"<i>$method</i>();<br/>"; } } echo '<h2>プロパティ</h2>'; $properties=get_class_vars($class); if(!count($properties)){ echo "<i>なし</i><br/>"; } else{ foreach(array_keys($properties) as $property){ echo "<b>\$$property</b>=".$object->$property.'<br/>'; } } echo '<hr/>'; } //省略しましたがここにクラスA、B、Cを用意しました。 $a=new A; $a->foo='sylvie'; $a->bar=23; $b=new B; $b->foo='bruno'; $b->quux=true; $c=new C; print_object_info($a); print_object_info($b); print_object_info($c); ?> これを実行すると途中からエラーになります。$classがどんな値か出力するために、 foreach($classes as $renban=>$class){ print_r("{$renban}:{$class}\n<br/>"); } にして出力したら、 0:stdClass …… 139:A 140:B 141:C になりました。(get_declared_classes()が返す値は、スクリプト内で自分が定義したクラス以外に、PHPがデフォルトで定義しているクラスもあることに、昨日気づきました。) 本を書いた人は、foreach文の直後の if(substr($class,0,2)=='__'){ continue; } の所でデフォルトの定義済みクラスを除外する目的だったと思います。 ここを、 foreach($classes as $class){ if(substr($class,0,1)!='A||B||C'){ continue; } に変えたらちゃんと画面が表示されました。 本を書いた人はなぜ、if(substr($class,0,2)=='__')にしたのでしょうか?また、if(substr($class,0,1)!='A||B||C')だとあらかじめ自分が定義しているクラスを記述しているのでなにかぱっとしない感じがします。自分が定義したクラス以外を除外という書き方でなく、デフォルトの定義済みクラスをうまく除外する方法などございましたらアドバイスの方よろしくお願いします。 こちらの環境は、windows vistaにxampp1.6.5、php5.2.5です。よろしくお願いします。

    • ベストアンサー
    • PHP
  • 関数explodeで文字列を分解して配列に格納

    デリミタで区切られた文字列を分解して配列に格納したいのですが、一部の文字でおかしな表示になってしまいます。何か解決策はありましたら教えてください。 デリミタは半角アンダーバーで、「神」があるとおかしくなってしまいます。 以下はソースです。 --------------------------------------- <?php $a="東京_神奈川_千葉"; $b=explode("_",$a); for($i=0;$i<sizeof($b);$i++){ echo $b[$i]."<br>"; } ?> ---------------------------------------- (出力) 東京 ・br>奈川 千葉 ---------------------------------------- (理想の出力) 東京 神奈川 千葉 ----------------------------------------

    • ベストアンサー
    • PHP
  • C言語 strlen 再入力を促す

    文字列の比較で、 文字列の長さが60以上の時、再入力を促します。 while文を使って書いてみたのですが、 文字列Bの入力の前に、もう一度意味もなく 「文字列Aを入力===>」が表示されたり。 文字列Aのほうが小さいのに「Aのほうが大きい」と 表示されるようになったり、変な感じです。 どなたかご指摘・ご指導のほどよろしくお願いします。 int main(void) { char moji1[100]; char moji2[100]; while(strlen(moji1)>60){     printf("文字列Aを入力===>"); scanf("%80s" ,moji1); } while(strlen(moji2)>60){     printf("文字列Bを入力===>"); scanf("%80s" ,moji2);    } if(compare(moji1,moji2)>0){ printf("===AはBより大きい===\n"); } else if(compare(moji1, moji2)<0){ printf("===AはBより小さい===\n"); } else if(compare(moji1, moji2)==0){ printf("===AとBは等しい===\n"); } return 0; } int compare(char *x, char*y) { while(*x==*y && *x!=0){ x++; y++; } return (*x-*y); }

専門家に質問してみよう