PHP7初級試験 模擬問題 – 出題範囲: データのグループ:配列の操作 からの出題となります。
受験を考えているあなたも、試験を合格したあなたも、ぜひチャレンジしてみてください!
問題
次の選択肢のなかで、誤っているものはどれでしょう? (1つ選択)
- 配列のキーには、数値もしくは文字列を使うことができる。数値のキーにはマイナス値が使用でき、文字列のキーが使われている配列は連想配列とも呼ぶ
- 配列の中にさらに配列を含めることができ、このような構造の配列を多次元配列と呼ぶ
foreach
を使うと配列の各項目に対し処理を行うことができる- 配列を並び替える関数として
rsort()
やasort()
やksort()
などあるが、連想配列の並び替えでキーを基準に並び替える関数はksort()
である - 配列から文字列を作成する
explode()
、文字列に区切り文字を指定して配列に変換するimplode()
がある
解答と解説は下にスクロールしてください
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
解答
正解は 5. です。
解説
1. 配列のキーには、数値もしくは文字列を使うことができる。数値のキーにはマイナス値が使用でき、文字列のキーが使われている配列は連想配列とも呼ぶ
選択肢のとおりです。
数値のキーにはマイナス値も 0
も指定できます。
新しい配列にキーを指定しない場合、キーは 0
から始まります。 1
からではありませんので注意してください。
0
から連続した数値をキーにするものは添字配列やリストとも呼ばれますが、こちらは連想配列と違い単に(狭義の)配列と呼ぶこともあります。
【試験合格後もステップアップ!】
PHP の配列は、厳密には添字配列と連想配列に違いはありません。
添字の数字と、連想の文字列を混在させることもできます。
PHP 8.1 以上では array_is_list()
関数で配列が添字配列であるかを判定することができます。
また、添字はキャストされるため想定外の結果を生むことがあるので注意してください。
$array = [
0 => 0,
-0 => 1, // $array[0] = 1、$array[-0] のキーは作成されないので注意
‘0’ => 2, // $array[0] = 2、$array[‘0’] のキーは作成されないので注意
0.9 => 3, // $array[0] = 3、キーが小数の場合は整数にキャストされる
false => 4, // $array[0] = 4、キーが false の場合は 0 にキャストされる
’00’ => 5, // $array[’00’] = 5、キャストされません
‘0.9’ => 6, // $array[‘0.9’] = 6、キャストされません
-1 => 7,
‘-1’ => 8, // $array[-1] = 8、キャストされます
1 => 9,
true => 10, // $array[1] = 10、キーが true の場合は 1 にキャストされる
” => 11, // ” という空文字キーも設定可能ですが要注意
null => 12, // $array[”] = 12、キーが null の場合は空文字列にキャストされる
INF => 13, // $array[0] = 13、キーが INF の場合は 0 にキャストされる
-INF => 14, // $array[0] = 14、キーが -INF の場合は 0 にキャストされる
NAN => 15, // $array[0] = 15、キーが NAN の場合は 0 にキャストされる
];
2. 配列の中にさらに配列を含めることができ、このような構造の配列を多次元配列と呼ぶ
選択肢のとおりです。
配列の中に配列を含める構造はプログラミングでよく使います。
ただし、多次元配列は多用すると複雑になりコードの理解を妨げる要因ともなりますので、適切に使用することを心がけてください。
【試験合格後もステップアップ!】
PHP の配列を操作する関数には、1 次元の配列を対象とする関数の他に、多次元配列を対象とし再帰的に処理してくれる便利な関数があります。
例えば count()
関数の第 2 引数に COUNT_RECURSIVE
を指定すると多次元配列内を再帰的にカウントするようになります。
3. foreach
を使うと配列の各項目に対し処理を行うことができる
選択肢のとおりです。
配列の各項目に対し処理を行う場合、一般的に foreach
をよく使います。
ケースによっては for
や while
などの繰り返し構文や、後述する配列操作関数の array_walk()
や array_map()
など使用することもできます。
【試験合格後もステップアップ!】foreach
や array_walk()
や array_map()
のどれを使えばよいかわからない場合は、まず foreach
を使うことをオススメします。array_walk()
や array_map()
関数にしかできない表記はなく、foreach
で対応するほうが柔軟に対応できる場合が多いです。
リファクタリング等で必要に応じて検討するようにしていただければ良いと思いますが、ほとんどのケースで foreach
で対応可能です。
一部、 array_sum()
という配列の合計を返す関数や、array_walk_recursive()
という多次元配列を再帰的に処理できる便利な関数などありますので、すべてを foreach
で対応せず目的に応じて検討してみてください。
4. 配列を並び替える関数として rsort()
や asort()
や ksort()
などあるが、連想配列の並び替えでキーを基準に並び替える関数は ksort()
である
選択肢のとおりです。
配列を並び替える関数として、添字配列を並び替える sort()
と、逆順に並び替える rsort()
関数があります。
また連想配列のキーと値のペアを保持したまま並び替える関数として、値を基準に並び替える asort()
、キーを基準に並び替える ksort()
、それぞれ逆順に並び替える arsort()
と krsort()
関数があります。
他にも、人間が行うような手法のような “自然順” で並び替えをする natsort()
や、さらに大文字小文字を区別しない natcasesort()
、ユーザー定義の比較を行う usort()
や uasort()
、 uksort()
があります。
【試験合格後もステップアップ!】
PHP 8.0 以降では緩やかな比較の動作が変更されています。これに伴い、配列の比較する関数にも影響が発生します。
例えば、 asort()
では第 2 引数にフラグを明示的に設定し、数値で比較するか文字列で比較するかを指定できますので、明示的な指定を心がけてください。PHP 8.0 以降へのバージョンアップ後も影響を最小限に抑えられます。
またこのフラグには “自然順” の指定もできるため、 natsort()
の関数の代わりとしても利用できます。
PHP 7.4 以前では、比較結果が等しくなる二つの要素があった場合、ソートした配列におけるそれらの並び順は不定でした。
PHP 8.0 以降では改善され、比較結果が等しくなる二つの要素があった場合、並び順は保持されるようになりました。
5. 配列から文字列を作成する explode()
、文字列に区切り文字を指定して配列に変換する implode()
がある
explode()
と implode()
の説明が逆です。
配列から文字列を作成するものが implode()
、文字列に区切り文字を指定して配列に変換するものが explode()
です。
この2つの関数はよく間違えやすいので、正しく覚えてください。
PHP はその他にも配列を操作する便利な関数があります。一例を下記に記します。
count()
: 配列の要素数を返すunset()
: 配列の要素を削除する、もしくは配列を削除するin_array()
: 配列の要素内に指定の値の存在を確認するarray_key_exists()
: 配列のキーまたは添字の中に指定のキーまたは添字が存在するか確認するarray_search()
: 配列の要素内に指定の値がある場合は、対応するキーを返すarray_reverse()
: 配列を逆順に並び替えた配列を返す
【試験合格後もステップアップ!】
PHP 8.0 以降では緩やかな比較の動作が変更されています。これに伴い、配列の比較する関数にも影響が発生します。
例えば、 is_array()
の第 3 引数は省略すると緩やかな比較になってしまうので、できる限り true
を明示し厳格な比較にするようにしてください。
PHP 8.0 以降へのバージョンアップ後も影響を最小限に抑えられます。
また、 全く同じ関数ですが関数名のみ異なるエイリアス関数があります。join()
は implode()
のエイリアスで、 key_exists()
は array_key_exists()
のエイリアスとなります。この 2 つのエイリアス表記はよく見かけるので注意してください。
このようなエイリアス関数は特別な理由がない限り使わず、エイリアスではない関数名に統一することをオススメします。