10
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

PHP5技術者認定試験(上級)に学ぶ、実は知らなかった配列関数(3)

Last updated at Posted at 2017-06-22

PHP5技術者認定試験(上級)

資格試験に向けて勉強中です
勉強していて、PHPについて実は知らなかった/勘違いしていたことを記載します。

今回もほとんどが関数のざっくり解説になっています。

こんな配列関数もあるんだーと、新しい発見に繋がれば幸いです。

配列

  • インデックス配列連想配列 があります。

  • キーに指定できるのは、整数と文字列のみ

  • 可能ならば整数に変換される

    • 浮動小数点 123.12 の場合、小数点を切り捨てた整数 123 に変換される
    • 10進数に変換可能な文字列 "123" は、整数 123 に変換される
    • 10進数に変換できない "0123" は、文字列 "0123" のまま

関数

関数 機能
count( $var ) 要素数を取得
sizeof( $var ) 上に同じく 要素数を取得
array_pad( $input, $size, $value ) sizeの長さに達するまで、valueを末尾に継ぎ足す。 負の値を指定すると先頭に追加する

配列の展開

関数 機能
list( $v1, $v2, ... ) = $array arrayの要素を変数v1, v2に格納する。 余った変数には NULL がセットされる。
array_slice( $array, $start, $len ) 分割。startからlenの数を取り出した配列を返す
array_chunk( $array, $size ) 分割。size数ごとの塊にする。(1次元配列は2次元になる)
array_splice( &$array, $start, [$len, [$replace]] ) 削除。 参照渡し 。 startからlen数分の要素を削除。replaceを指定子た場合は、削除した場所にそれを挿入。
  • list() = $array の構文は違和感のかたまり

キーや値の操作

  • isset($array[$key]) は、 キーが存在しても、値がNULLの場合はfalseを返す
    • array_key_exsists($key, $array) を使おう
  • array_search() は最初に見つかったkeyのみ返す

in_array() はPHPの良心

変数の展開

  • 文字列内で2次元配列を展開する場合は波括弧で括る必要あり。
    • echo "値は {$array[0][0]}"
関数 機能
extract( &$array [, $option, $prefix] ) キーと値を、変数名と値として、そのスコープに展開する。変態向けの関数。
compact( $value ) 変数名と値を、キーと値とした配列を返す。同じく変態向け。
  • compact()は、 引数が配列の場合は、 値の文字列がキーとなる
  • extract()は、 変数名の接頭辞を指定可能
    • この関数を使う人とは友達になりたくない

順次処理

  • foreach($array as $key => $val) は、 配列のコピーを作成してから処理を行う ため、ループ中に要素数を変更しても変わらず処理する

イテレータ

関数 機能
key( &$array ) イテレータが指す要素のキーを返す
current( &$array ) イテレータが指す要素の値を返す
each( &$array ) イテレータが指す要素の キーと値を配列にして 返す。イテレータを次へ移動
next( &$array ) イテレータを次へ移動し、その値を返す
prev( &$array ) イテレータを前へ移動し、その値を返す
end( &$array ) イテレータを末尾へ移動し、その値を返す
reset( &$array ) イテレータを先頭へ移動し、その値を返す
  • いつかもし current() を使うときには list($key, $val) = current($array) としたいと思った。

要素に対する関数

関数 機能
array_walk( &$array, $funcname[, $callbackの第三引数] ) それぞれの要素に関数を実行
array_map( $callback, $array1 [, $array2, ...] ) callbackの実行結果を配列にして返す。array1は第一引数の集合、array2は第二引数の集合
array_sum( $array ) 値の和
array_product( $array ) 値の積
array_reduce( $array, $callback [, $初期値] ) 全部合計するとかができる(説明放棄)

ソート

シンプルなもの

関数 機能
sort( &$array ), rsort( &$array ) 昇順/降順ソート。キーが振り直される。
asort( &$array ), arsort( &$array ) 値でソート。キーはそのまま。
ksort( &$array ), krsort( &$array ) キーでソート。キーはそのまま。
usort( &$array, $callback ) ユーザー定義関数でソート。キーは振り直される。
uasort( &$array, $callback ) ユーザー定義関数(引数は値)でソート。キーはそのまま。
uksort( &$array, $callback ) ユーザー定義関数(引数はキー)でソート。キーはそのまま。
natsort( &$array ) 自然順ソート。キーが振り直される。
natcasesort( &$array ) 自然順ソート(大文字小文字を区別しない)。キーが振り直される。

関数 機能
array_multisort( &$array1, &$array2 ) array1の順に合わせて array2の順も変わる
array_reverse( &$array ) 逆順に並べ替える
array_flip( &$array ) キーと値を入れ替える
shuffle( &$array ) ランダムに並べ替え。キーが振り直される。
  • array_multisort()の optionは SORT_ASC SORT_DESC など

演算

関数 機能
array_merge( $array1, $array2 ) マージ
array_diff( $array1, $array2 ) 差分を集めた配列を返す
array_fillter( $array1, $funcname ) 関数の結果がtrueのものを配列にして返す。 キーはそのまま
array_unique( $array ) 重複を削除。 キーはそのまま
array_intersect( $array1, $array2 ) 重複のみを返す逆diff。 キーはそのまま

追加と削除

関数 機能
array_unshift( &$array, $val ) 先頭に追加
array_shift( &$array ) 先頭を削除
array_push( &$array, $val ) 末尾に追加
array_pop( &$array ) 末尾を削除

そこはかとなく js っぽさを感じる

他のtips

キーを指定しない場合 1

$arr = [];
$arr["qiita"] = "a";
$arr[] = "b";
$arr[] = "c";

上記の場合 [ "qiita" => "a", 0 => "b", 1 => "c" ] となる

キーを指定しない場合 2

$arr = [];
$arr[] = "a";
$arr[3] = "b";
$arr[] = "c";

上記の場合 [ 0 => "a", 3 => "b", 4 => "c" ] となる

整数添字は最大数をインクリメントしていくんですね。

終わりに

PHPの配列関数、痒いところに手が届くものもあれば
コンパイル言語使用者が見たら吐き気を催すものまでありますね…。

いいね!頂けると勉強が捗ります。

10
8
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?