• ベストアンサー
  • 暇なときにでも

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(){ } のような引数なしの関数の書き方でいいのでしょうか?

共感・応援の気持ちを伝えよう!

  • 回答数5
  • 閲覧数407
  • ありがとう数5

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

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

問1 プログラム上では、『文字列とは文字型データの配列である』という、プログラマとしての常識を前提として書かれているという事ですね。その、"手元のプチリファレンス"には。 (※正確には言語によっては『文字列とは文字列型のクラスである』という場合もあるので、厳密には正しくないが、概ね先の常識を踏襲していると言っていい) 一文字目は、配列インデックスで言えば0(番目)の文字。 問2 >Warnning というメッセージがちらほらと せっかくインストーラが出しているWarnningを読まずに、無視して何がしたいのでしょう? 使いたい機能が使えてるなら、それでいいんじゃないですか? それでイヤなら、ちゃんと読めばいいだけの話です。 問3 VBAに言語構造として、サブルーチンなどありません。 サブルーチンとは考え方、または実装の仕方の話です。 VBAでの Sub sub_keisan(){ } のような、書き方はサブプロシージャです。決してサブルーチンなどではありません。(サブルーチンとして実装したなら、サブルーチンではあるんでしょうが) VBAでは、値を返すプロシージャはFunction、値を返さないプロシージャはSubと別々に実装しているだけです。 PHPはすべて、どちらもFunctionで記述します。(引数を受け取る受け取らない、値を返す返さないはFunction記述者が自由に設計すればいいだけです。

共感・感謝の気持ちを伝えよう!

質問者からのお礼

了解しました。0番目の文字が、最初になるわけですね。 警告内容を書かないとわかりませんよね。失礼しました。 どちらもFunctionで通じることを確認しました。てっきり別々のものがあるものと思っていました。

関連するQ&A

  • よく、書式で出てくる ○○ ( ○○, ○○ [, ○○ ] ) の

    よく、書式で出てくる ○○ ( ○○, ○○ [, ○○ ] ) の [, って何ですか? PHPを最近はじめました超初心者です。 たとえば、書式の説明で mb_substr( '文字列', 取り出す範囲の開始位置 [, 文字数 ] ); ↑このようなものとかありますが、  [, ってミスですか? mb_substr( '文字列', 取り出す範囲の開始位置 , [ 文字数 ] ); ↑こうではないのですか? [ と , が入れ替わっているのは 何か意味があるのでしょうか?

    • ベストアンサー
    • PHP
  • C#でPHPの可変関数のような事ができるでしょうか

    すみません、ご存じの方教えてください。 PHPでは次のような形で文字列で関数を呼び出せるようですが、C#でも同じ事ができますでしょうか? $str = "MyFunc1"; $str("Hellow"); function MyFunc1($abc){ echo "$abc"; }

  • phpのsubstr_countについて

    <?php $str = "検索対象の文字列をここに指定します。文字列です。文字列。"; $word = "文字列"; var_dump( substr_count( $str, $word ) ); ?> とするとint(3)と帰ってくると思いますが、もし出現回数が5回以上であれば$wordを表示するというプログラムを書きたいのですが、php初心者なのでよくわかりません どなたかアドバイスお願いします。

    • 締切済み
    • PHP

その他の回答 (4)

  • 回答No.5
  • yambejp
  • ベストアンサー率51% (3827/7415)

問2についてPEARはPHP4のころからの技術なので PHP5のバージョンと整合性がとれていないだけだと error_reporting(E_ALL ^ E_NOTICE); のようにエラーレベルを調整すればよいかと。 php.iniでも対応可能です。

共感・感謝の気持ちを伝えよう!

質問者からのお礼

なるほど、バージョンによる整合性ですか。確認してみます。 回答ありがとうございました。

  • 回答No.4
  • notnot
  • ベストアンサー率47% (4591/9637)

1. 文字列の先頭を1文字目と数えるのは、現在メジャーな言語ではVB系くらい。他の言語は先頭は0文字目です。 配列のインデクスの始まりと合わせてるのでしょうね。Cだと文字列型は存在せず、文字の配列しか無いので、その影響だと思います。 2. 警告の内容次第ですが、エラーで無いので大丈夫では? 「警告が出たのですが大丈夫?」と聞かれても答えようが無いです。 3. VBのCallでも引数ありますよね。 引数なしのPHP functionはもちろんOKです。 >VBやVBAでいえば、Call文で呼んでくるような、 の言わんととするところが不明です。引数を括弧で囲まないという意味なら出来ません。

共感・感謝の気持ちを伝えよう!

質問者からのお礼

配列と同じく、先頭は0から開始で納得しました。 警告内容については、これじゃ分かりませんね。失礼しました。特に、影響らしい影響はないみたいです。 引数なしの functionでうまくいきました。 ご回答ありがとうございました。

  • 回答No.3

>抽出開始位置 ではなく、抽出を開始したい手前の位置 ではないのかと思いました。 http://jp2.php.net/manual/ja/function.substr.php >start が正の場合、返される文字列は、 string の 0 から数えて start番目から始まる文字列となります。 例えば、文字列'abcdef'において位置 0にある文字は、'a'であり、 位置2には'c'があります。 何故公式リファレンスを読まない? >手元のプチリファレンスには、 それにしても最近の糞プログラマは公式リファレンスすら読めないのか? 2. その肝心の中身を書かないでわかるかよ。 俺たちは君のPCを透視できる超能力者か? 3. そんな物必要ない。 それとすべての行を一行開けにするな。読みづらい。

共感・感謝の気持ちを伝えよう!

質問者からのお礼

公式リファレンスにしっかり書かれていました。「位置 0にある文字は、'a'であり…」 さすがに警告内容を書かないとわかりませんね。 失礼しました。

  • 回答No.1
noname#158634

問1 一般にプログラム言語におけるカウントは0から始まるからです。 問2 メッセージの内容も書かずに分かるわけがあるか(笑) 問3 呼び出そうとしているのが「引数なしの関数」であればその書き方で問題ありません。

共感・感謝の気持ちを伝えよう!

質問者からのお礼

0からのカウント、了解しました。 配列と同じ考え方ですね。 メッセージ内容については失礼しました。これでは、分かりませんよね。 引数なしの関数の書き方について、確認しました。 ご回答ありがとうございました。

関連するQ&A

  • substrの使い方

    文字列の一部だけを表示するため「substr」を利用しようとしていますが、うまくできません。 問題となっているのは2点です。 1.半角英数のみと日本語のみで長さが全然違う。 2.半角英数+日本語で日本語で切れるとき、最後の文字が文字化けする。 これを解決したいのですが、どうしたらよいでしょうか? 現状は以下のようになっています。 #文字数を指定 $mc = 38; #題名を短くする if (length($title) > $mc) {   $title = substr($title,0,$mc);   $title .= "..."; }

    • 締切済み
    • CGI
  • php修正について

    下記のPHPを書いています。 表示したときに_(/)されて文字と日付が出ないといけないのですが? 正しい表示は 強豪ぞろいの天皇賞ー武は1枠で波乱倍増??? (10/27)です。 Mysqlはデータは入っています。 教えてください。 <?php do { ?> <BLINK><IMG src="list.gif" width="13" height="13" border="0"></BLINK><FONT color="#cc00cc"><a href="blog_02.php?id=<?php echo $row_rs_blog_02['id']; ?>"><?php echo mb_substr($row_rs_blog_02['title'],0,30); ?> <?php if (mb_strlen($row_rs_blog['title']) >= '30') { echo('…'); } ?> </a><?php echo "("; echo substr($row_rs_blog_02['date'], 4,2); echo "/"; echo substr($row_rs_blog_02['date'], 6,2); echo ")"; ?></FONT><br> <br> <?php } while ($row_rs_blog_02 = mysql_fetch_assoc($rs_blog)); ?>

    • ベストアンサー
    • PHP
  • C言語の質問です><

    C言語の質問です>< 次のような実行結果が得られるプログラミングをしたいのですが・・ ちなみにポインタや標準関数のstrシリーズは使用不可です。 文字列1:ABCDEFGHIJ 開始位置:0 文字数:3 文字列2:ABC 開始位置が7で文字数が5とかの場合は'¥0'の位置まで表示するようにしたいのですが、自分の以下のプログラムだと開始位置が0で文字が3だとABCと表示できるのですが、開始位置が7で文字数が5とかだとできません>< #include<stdio.h> void main(void) { char m1[]="ABCDEFGHIL"; char m2[11]; int i,j,start,mozikazu; printf("文字列1:%s\n",m1); printf("開始位置:"); scanf("%d",&start); if(start >=0 && start <11) { printf("文字数:"); scanf("%d",&mozikazu); } if((start+mozikazu)<11) { for(i=0;i<mozikazu;i++) { m2[i]=m1[i]+start; } m2[i]='\0'; } printf("文字列2:%s\n",m2); return; } どうか教えてください><

  • substrについて

    入力ファイルから28文字分のファイル名を取り出し、リモートからローカルにダウンロードしたいのですが、substrがうまく働きません。 どのようにすればよいのでしょうか? 以下のとおり記述しています。 open (INPUT,"<$path/$filename") || die "could not open file : $!\n"; print "$path/$filenameファイルをオープンしました。"; print "\n"; while(<INPUT>) { $FTPremotefilename = substr($_,0,28); print "FTPremotefile名は$_です。"; print "\n"; $FTP -> get($FTPremotefile, $FTPlocalfile) || die "Get失敗 $!\n";# ゲット(ファイルのダウンロード) } close (INPUT) || die "could not close file : $!\n"; $_は内容が表示されるのですが、substrで指定した、$FTPremotefileになにも抽出されませんでした。

    • ベストアンサー
    • Perl
  • PATH_INFOで「?」を含む文字列を受け取る方法

    環境変数 PATH_INFOで「?」(クエスチョンマーク)を含む文字列を受け取りたいです。 例えば「hoge.php/test?abc」で $g = $_SERVER['PATH_INFO']; $g = substr($g, 1); echo $g; とすると「abc」と表示されてしまいます。 この際「test?abc」と表示させるには、どのようにすれば良いでしょうか。 宜しくお願いします。

    • ベストアンサー
    • PHP
  • 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 ?>

    • ベストアンサー
    • PHP
  • javascriptで2箇所のphpの関数を取得したいのです。

    javascriptで2箇所のphpの関数を取得したいのです。 見よう見まねでやっている初心者です。よろしくお願いします。 javascriptにてphpの関数をよびだしてhtmlのinput type="text"に値を出力しようとしています。 2か所のphp を下記のようにhtmlに書いて取得しようとしたのですがどちらか一方しか取得できません。 なんとか両方を読み込めるようにできないでしょうか?分かりにくい質問かと思いますので例を書いて見ましたのでどうかよろしくお願いいたします。 (例) <script type="text/javascript" src="../data/zzz.php?aaa=abc" ></script> <script type="text/javascript" src="../../../data/xxx.php?bbb=abc" ></script> 上記のように書いても片方しか取得しないようです。 以下../dataのzzz.phpのphpです。 <?php $aaa = $_GET['aaa']; header("Content-type: application/x-javascript"); echo "window.onload = function () {"; if ($aaa== 'abb') {echo "document.getElementById(\"xxx\").value=100;","document.getElementById(\"yyy\").value=1;";} elseif ($aaa == 'abc') {echo "document.getElementById(\"tanka\").value=120;","document.getElementById(\"yyy\").value=2;";} echo "}"; ?> 以下../../../dataのxxx.phpのphpです。(例) <?php $bbb = $_GET['bbb']; header("Content-type: application/x-javascript"); echo "window.onload = function () {"; if ($bbb== 'abb') {echo "document.getElementById(\"zzz\").value=50;","document.getElementById(\"vvv\").value=10;";} elseif ($bbb == 'abc') {echo "document.getElementById(\"tanka\").value=51;","document.getElementById(\"vvv\").value=20;";} echo "}"; ?> 以上2か所のディレクトリのphpを取得したいのですが、これはできない事なのでしょうか?ちがうディレクトリから取得しなければ更新作業が大変になってしまうのです。どうかよろしくお願いいたします。

    • ベストアンサー
    • PHP
  • PHPでパラメータ取得

    ※httpのhを省いています。 //index.phpの内部に if( $_REQUEST['m'] == "abc" ) { echo 'abc'; } if( $_REQUEST['m'] == "cde" ) { echo 'cde'; } というプログラムがあり、 ttp://example.com/index.php?a=abc とした時、「abc」が返され、 ttp://example.com/index.php?a=cde とした時、「cde」が返されるのは分かりますが、「abc」も「cde」も両方共表示できるにはどのようなにしたらURLが良いですか? あるいは、プログラムの一部を変えて両方表示する方法はあるでしょうか? ただし、下記の場合を除くとします。 ttp://example.com/index.php?a=abc if( $_REQUEST['m'] == "abc" ) { echo 'abc'; echo 'cde'; } お手数ですが、よろしくお願い致します。

    • ベストアンサー
    • PHP
  • 全角半角あわせて3文字

    全角半角が混在している文字列の左から3文字を取得したい場合にいい方法はないでしょうか? mb_substr関数で第3パラメータはバイト数で指定するようです。 関数リファレンスでは「最大文字数」って表現になってます。 http://php.net/manual/ja/function.mb-substr.php 半角なら文字数=バイト数ですが、全角だと指定の半分の文字数になります。 最大だから間違ってはないですが、文字数じゃないよな‥‥っていつも思ってます。 いったん半角→全角にして、6バイト分を切り出すのはできます。 でも、英数字も全角半角混在してるので元の文字列を壊したくないのです。 mb_substrの第3パラメータを6から3まで、mb_strlenが3になるまで回すのもやってみました。 でも、なんかスマートじゃないんですよ‥‥。 なにかこう、スマートないい手はないでしょうか? よろしくお願いします。

    • ベストアンサー
    • PHP
  • 【PHP】関数で処理が止まってる??

    お世話になります。 PHPでの質問ですが、PHPに限ったものではないように思いますので、プログラム全般に対しての質問と思って下さって結構です。 ※PHP特有のという意見があれば、それも大歓迎です。 下記のようなコードを組んでみました。 <?php echo "func1の結果["; echo func1(); echo "]"; function func1(){ (内容は割愛) return TRUE; } ?> このコードをアップしてアクセスしてみると   出力結果  func1の結果[ でした。 ブラウザのステータスに「ページが表示されました」とあるので、処理中で出力待ちということはないと思います。 > echo func1(); > echo "]"; の箇所の出力はどうなっていると考えればいいのでしょうか? 「関数の内容次第で・・・」とお答えになる方、どういう内容だとこのような結果になるのかというところでお答えください。 私のプログラムによる根本的な考え方は、プログラムは上から下に順番になので、 上記内容の箇所にどんなコードがあったとしても、func1関数はTRUEを返すので、結果としては「func1の結果[1]」となるはずでした。 でも実際の出力結果をみると処理が途中で(おそらくfunc1()内で)止まっているともいます。 timeoutではないため無限ループに嵌ってっていうのもないと思います。 これはどういうことでしょう???

    • 締切済み
    • PHP