[模擬問題] PHP8初級 – テキスト操作 (CTO古庄道明からの出題)

こんにちは。PHP技術者認定機構 CTOの古庄道明です。
今日もPHP8初級試験の模擬問題と解説を紹介します。
以下を解いて出題のイメージと知識を補っていただけると幸いです。

目次

問題

テキスト操作に関するコードの説明のうち、誤っているものはどれか。
(%は全角記号で書かれているが、半角記号として回答すること)

選択肢

選択肢1
「print ucwords(strtoupper(‘kusanagi saya’));」の実行結果は「KUSANAGI SAYA」である。

選択肢2
「print substr(‘abcde’, 0, 3);」の実行結果は「abcd」である。

選択肢3
「print strlen(trim(‘01230’));」の実行結果は「5」である。

選択肢4
「printf(‘%05d’, ‘123’);」の実行結果は「00123」である。

選択肢5
「print str_replace(‘{num}’, ‘3’, ‘I have {num} cats.’);」の実行結果は「I have 3 cats.」となる。

回答と解説

問題は「テキスト操作について」です。

選択肢1を見ていきましょう。
関数 strtoupper() が呼ばれた後に、ucwords() が呼ばれるコードになります。
まず strtoupper() は「文字列を大文字にする」関数になります。
https://www.php.net/manual/ja/function.strtoupper.php
そのため、この関数が呼ばれた時点で、戻り値は ‘KUSANAGI SAYA’ となります。
次に ucwords() ですが、この関数は「文字列の各単語の最初の文字を大文字にする」関数です。
https://www.php.net/manual/ja/function.ucwords.php
「各単語」は、基本的に「スペース」などが区切り文字として認識されます(第二引数で明示的に指定をすると、その文字が単語の区切り文字になります)。
そのため、’KUSANAGI SAYA’ は ‘KUSANAGI’ と ‘SAYA’ の2単語と見なされます。
そして「各単語の最初の文字を大文字にする」ため、KUSANAGIの最初のKとSAYAの最初のSが大文字になります。ただ、今回は「その前に strtoupper() ですべての文字がすでに大文字になっている」ために、変化はありません。
そのため、実行結果は ‘KUSANAGI SAYA’ となります。

したがって、この選択肢の内容は正しい説明です。

選択肢2を見ていきましょう。
関数 substr() が呼ばれています。これは「文字列の一部分を返す」関数になります。
https://www.php.net/manual/ja/function.substr.php
第一引数 string $string が「入力文字列(「一部を切り出す」元になる文字列)」になります。
第二引数 int $offset が 「何文字目から切り出すか?」の指定となり、第三引数 ?int $length が指定されている場合は「切り出す文字数」となります。
今回は substr(‘abcde’, 0, 3) であるため「0番目から3文字を返す」指定となるので、’abc’ の3文字が返ってくる(出力される)挙動となります。

選択肢は ‘abcd’ と書いてあるため、この選択肢は誤った記述です。

なお、関数 substr() の挙動は、第二引数が「負の値や、第一引数の文字数以上の場合」など、第三引数が「負や0の値、nullを指定した場合」などで動きが少し異なってくるので、いろいろと試してみるとよいでしょう。

選択肢3を見ていきましょう。
関数 trim() が呼ばれた後に、関数 strlen() が呼ばれるコードになります。
まず関数 trim() ですが、これは「文字列の先頭および末尾にあるホワイトスペースを取り除く」関数です。
https://www.php.net/manual/ja/function.trim.php
正確には、第二引数にパラメタを明示するとホワイトスペース以外も取り除けるのですが、引数を省略すると、文字列の前後の、空白や改行、タブなどを取り除きます。
今回与えられている文字列は ‘01230’ のため特に除去する文字はないので、’01230’がこのまま返ります。
次に strlen() ですが、これは「文字列の長さを得る」関数になります。
https://www.php.net/manual/ja/function.strlen.php
引数に入る文字列は ‘01230’ であるため、文字数は5文字となり、5が得られます。

したがって、この選択肢の内容は正しい説明です。

選択肢4を見ていきましょう。
printf()は「フォーマット済みの文字列を出力する」関数です。
https://www.php.net/manual/ja/function.printf.php
%dは「整数を出力する」フォーマットであり、%05dになると「数値の左側を0埋めして5桁になるようにフォーマットした整数を出力する」となります。
そのため、引数に ‘123’ が与えられると、’123′ が 123 と解釈され、次に5桁になるように先頭に0を埋めるために 00123 となり、結果として出力は 00123 となります。

したがって、この選択肢の内容は正しい説明です。

選択肢5を見ていきましょう。
str_replace() は「検索文字列に一致したすべての文字列を置換する」関数です。
https://www.php.net/manual/ja/function.str-replace.php
第一引数 array|string $search にマッチした文字を、第二引数 array|string $replace に置き換えます。
上述の置換処理は、第三引数 string|array $subject の文字列に対して行われます。

今回は、まず置換対象が ‘I have {num} cats.’ となります。
そして、第一引数 ‘{num}’ にマッチした文字を、第二引数 ‘3’ に置換します。
そのため、 ‘I have {num} cats.’ の {num} の部分が 3 に置換されるので、結果として ‘I have 3 cats.’ となります。

したがって、この選択肢の内容は正しい説明です。

初級模擬試験では、選択肢2に誤りがあるため、選択肢2が正解になります。

PHP8初級試験と公式問題集に興味がある方は、以下のページをご覧のうえ、この機会に是非受験ください。

PHP8初級試験
https://www.phpexam.jp/summary/novice8

公式問題集:PHP8技術者認定初級試験公式問題集A
Kindle版 https://amzn.asia/d/1bS88y9
ペーパーバック版 https://amzn.asia/d/3P3Izeu

また、試験対策セミナーは毎月開催しています。興味がある方は以下のページをご覧いただき是非セミナーにもご参加ください。(フォローいただけるとセミナーのご案内が届くようになります)

PHP技術者認定機構の公式Peatixグループ
https://peatix.com/group/43424

www.phpexam.jp

この記事が気に入ったら
いいね または フォローしてね!

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次