こんにちは。PHP技術者認定機構 CTOの古庄道明です。
今日もPHP8初級試験の模擬問題と解説を紹介します。
以下を解いて出題のイメージと知識を補っていただけると幸いです。
問題
次のコードの実行結果として正しいものはどれか。
$num[0] = 'zero';
$num[1] = 'one';
$num[3] = 'three';
$num[2] = 'two';
print ('【loop_A】');
for ($i = 0, $count_num = count($num); $i < $count_num; $i++) {
print ($num[$i] . ',');
}
print ('【loop_B】');
foreach ($num as $i => $n) {
print ($i . ',');
}
選択肢
選択肢1【loop_A】0,1,3,2,【loop_B】zero,one,two,three,
選択肢2【loop_A】0,1,2,3,【loop_B】0,1,3,2,
選択肢3【loop_A】zero,one,two,three,【loop_B】zero,one,three,two,
選択肢4【loop_A】zero,one,two,three,【loop_B】0,1,3,2,
選択肢5【loop_A】zero,three,one,two,【loop_B】0,1,2,3,
回答と解説
問題は「制御構文について」です。ただし、制御構文だけでなく、配列に関する知識も少し必要です。
構造を3つに分けて、それぞれ見ていきましょう。
まずはこの部分です。
$num[0] = 'zero';
$num[1] = 'one';
$num[3] = 'three';
$num[2] = 'two';
基本的には「配列を作っている」のですが、ポイントは順番です。
PHPでは「要素が追加された順番」が保持されます。
$num[0] = 'zero';
$num[1] = 'one';
$num[3] = 'three';
$num[2] = 'two';
print_r($num);
のコードを動かしてみると
Array
(
[0] => zero
[1] => one
[3] => three
[2] => two
)
のようになります。
この部分を覚えておきましょう。
次はコードのこの部分です。
print ('【loop_A】');
for ($i = 0, $count_num = count($num); $i < $count_num; $i++) {
print ($num[$i] . ',');
}
こちらは、for文を使っています。
式1 のループ開始時処理では、
$i = 0
$count_num = count($num)
の二つの式が書かれています。
これによって「$iが0で初期化され」「$count_numには、$numの要素の個数である4が代入される」状態になります。
続いて、式2 の繰り返しの判定が $i < $count_num のため、$iが4未満なら繰り返しが続きます。
また、式3 が $i++ なので、繰り返しの後に $i がインクリメント(+1)されます。
そのため全体としては「0から順番に3まで」$iの値が変化します。
その中で
print ($num[$i] . ',');
とやっています。
この for 文は、配列に追加された順番で処理しているのではありません。$i の値を 0, 1, 2, 3 と変化させながら、$num[$i] を参照しています。
そのため、全体としては
$num[0]
$num[1]
$num[2]
$num[3]
の順番で参照します。
結果として、はじめは zero、次は one、次は two、最後は three が出力されます。
最後にコードのこの部分です。
print ('【loop_B】');
foreach ($num as $i => $n) {
print ($i . ',');
}
foreachは、配列を反復処理します。
配列に追加された順番に処理されるため、$i => $n には
0 => zero
1 => one
3 => three
2 => two
が、この順番で処理されていきます。
また、コードでは
print ($i . ',');
となっているので、結果として0,1,3,2,
と出力されることがわかります。
そのため、全体としては(わかりやすく改行を入れていますが)
【loop_A】
zero,one,two,three,
【loop_B】
0,1,3,2,
がそれぞれ出力されることがわかります。
上述と等しいのは、選択肢4の【loop_A】zero,one,two,three,【loop_B】0,1,3,2,
であるため、正解は選択肢4です。
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

