質問: str_replace(' ', ',', $num); echo substr($str, ); ``` ### エラーメッセージ ``` PHP Notice: A non well formed numeric value encountered in /workspace/ ``` 本来数値(1, 4)を入れるべきところへ変数($n)を入れると上記のエラーが出ます。 しかしそうするとbcdfと出力され、回答通りにいきません。 しかし、これ以上の方法が思いつきません。 よろしくお願いします。
回答: こういう働きをするプログラムを得たいのではないかと思います。 まずはそのまま試してみてください。 ` 2 ) { $s = mb_substr( $str, intval( $numstrs[ 1 ] ) - 1, intval( $numstrs[ 2 ] ) ); echo $s; } ?>` preg_match() は、正規表現で文字列の照合をしてくれる便利関数です。 第1引数が正規表現、第2引数が元の文字列、第3引数が結果の入る変数です。 今回の場合、'1 4;' という文字列から、1 と 4 という2つの数字を別々に抜き出す必要がありますが、こういう時は正規表現が便利です。 もしかすると題意は「標準入力を1文字ずつ読み取って数字を取り出すプログラムを書け」なのかも知れませんが(行末のセミコロンが「その匂い」を漂わせている)、ちょっと面倒そうです。 そこで本回答では、指定数字の入った文字列を「数字の連続」「非数字の連続」「数字の連続」という3つの部分に分けて照合し、「数字の連続」だけを取り出すようにしました。 PHP の正規表現で ( ) を使うと、「合致する部分」を要素に持つ配列が得られます。 '1 4;' を与えた場合、$numstrs[0] は元の文字列である '1 4;'、$numstrs[1] は '1'、$numstrs[2] は '4' になります。 後は、得られた2つの数字列を数値にして mb_substr() するだけです。 mb_substr() の第2引数で -1 するのは、質問者様がお考えの通りです。 なお、substr() は文字列をバイト単位で扱うので、場合によっては注意が必要です。 文字数単位で扱う mb_substr() の方が(処理はたぶん重いが)、予期せぬ間違いは少ない、と思います。