配列

概要

  • PHPの配列は連想配列(ハッシュ)と共存している。
    ハッシュのキー数値か文字列でできている。
    配列と呼ばれているものも単に数値がキーとなったハッシュと解釈しても構わない。
    そのため、配列のキーは数値と文字列が混在する可能性が常に存在する。

関数一覧

分類関数名意味
情報array_count_valuesExternal Site配列の同じ値の個数を集計した配列を返す
情報array_key_existsExternal Site指定したキーまたは添字が配列にあるかどうかを調べる
情報countExternal Site変数に含まれるすべての要素、 あるいはオブジェクトに含まれるプロパティの数を数える
情報in_arrayExternal Site配列に指定した値があるか判定する
情報sizeofExternal Sitecount のエイリアス
生成array_fill_keysExternal Siteキーを指定して、配列を値で埋める
生成array_fillExternal Site配列を指定した値で埋める
生成array_padExternal Site指定長、指定した値で配列を埋める
生成arrayExternal Site配列を生成する
生成compactExternal Site変数名とその値から配列を作成する
生成rangeExternal Siteある範囲の整数を有する配列を作成する
取得・追加array_popExternal Site配列の末尾から要素を取り除く
取得・追加array_pushExternal Site一つ以上の要素を配列の最後に追加する
取得・追加array_randExternal Site配列から一つ以上のキーをランダムに取得する
第二引数に2以上の値を入れるとキーの配列を返す
取得・追加array_shiftExternal Site配列の先頭から要素を一つ取り出す
取得・追加array_sliceExternal Site配列の一部を展開する
取得・追加array_spliceExternal Site配列の一部を削除し、他の要素で置換する
取得・追加array_unshiftExternal Site一つ以上の要素を配列の最初に加える
取得・追加listExternal Site配列と同様の形式で、複数の変数への代入を行う
変換array_chunkExternal Site1次元配列を指定した数で分割した2次元配列として返す
変換array_combineExternal Site2つの配列の各要素をキーと用途にした1つの配列として返す
変換array_flipExternal Site配列のキーと要素を反転する
変換array_keysExternal Site配列のキーをすべて返す。もしくは与えられた検索条件に一致するキーをすべて返す
変換array_reverseExternal Site要素を逆順にした配列を返す
変換array_valuesExternal Site配列の全ての要素を返す
変換shuffleExternal Site配列の要素をシャッフルする
結合array_merge_recursiveExternal Site二つ以上の配列を再帰的にマージする
結合array_mergeExternal Siteひとつまたは複数の配列をマージする
一括処理array_mapExternal Site指定した配列の要素にコールバック関数を適用する
一括処理array_productExternal Site配列の値の積を計算する
一括処理array_reduceExternal Siteコールバック関数を用いて配列を普通の値に変更することにより、配列を再帰的に減らす
一括処理array_sumExternal Site配列の中の値の合計を計算する
一括処理array_walk_recursiveExternal Site配列の全ての要素に、ユーザー関数を再帰的に適用する
一括処理array_walkExternal Site配列の全ての要素にユーザ関数を適用する
ソートarray_multisortExternal Site複数の多次元の配列をソートする
ソートarsortExternal Site連想キーと要素との関係を維持しつつ配列を逆順にソートする
ソートasortExternal Site連想キーと要素との関係を維持しつつ配列をソートする
ソートkrsortExternal Site配列をキーで逆順にソートする
ソートksortExternal Site配列をキーでソートする
ソートnatcasesortExternal Site大文字小文字を区別しない"自然順"アルゴリズムを用いて配列をソートする
ソートnatsortExternal Site"自然順"アルゴリズムで配列をソートする
ソートrsortExternal Site配列を逆順にソートする
ソートsortExternal Site配列をソートする
ソートuasortExternal Siteユーザ定義の比較関数で配列をソートし、連想インデックスを保持する
ソートuksortExternal Siteユーザ定義の比較関数を用いて、キーで配列をソートする
ソートusortExternal Siteユーザー定義の比較関数を使用して、配列を値でソートする
検索・置換array_searchExternal Site指定した値を配列で検索し、見つかった場合に対応するキーを返す
検索・置換array_change_key_caseExternal Site配列のすべてのキーを変更する
検索・置換array_replace_recursiveExternal Site渡された配列の要素を再帰的に置き換える
検索・置換array_replaceExternal Site渡された配列の要素を置き換える
抽出array_diff_assocExternal Site追加された添字の確認を含めて配列の差を計算する
抽出array_diff_keyExternal Siteキーを基準にして配列の差を計算する
抽出array_diff_uassocExternal Siteユーザが指定したコールバック関数を利用し、 追加された添字の確認を含めて配列の差を計算する
抽出array_diff_ukeyExternal Siteキーを基準にし、コールバック関数を用いて配列の差を計算する
抽出array_diffExternal Site最初の配列から共通項を除いた配列を返す。
第二引数以降の配列で共通しないものは含まれない。配列の差を計算する
抽出array_filterExternal Siteコールバック関数を使用して、配列の要素をフィルタリングする
抽出array_intersect_assocExternal Site追加された添字の確認も含めて配列の共通項を確認する
抽出array_intersect_keyExternal Siteキーを基準にして配列の共通項を計算する
抽出array_intersect_uassocExternal Site追加された添字の確認も含め、コールバック関数を用いて 配列の共通項を確認する
抽出array_intersect_ukeyExternal Siteキーを基準にし、コールバック関数を用いて 配列の共通項を計算する
抽出array_intersectExternal Site配列の共通項を計算する
抽出array_udiff_assocExternal Siteデータの比較にコールバック関数を用い、 追加された添字の確認を含めて配列の差を計算する
抽出array_udiff_uassocExternal Siteデータと添字の比較にコールバック関数を用い、 追加された添字の確認を含めて配列の差を計算する
抽出array_udiffExternal Siteデータの比較にコールバック関数を用い、配列の差を計算する
抽出array_uintersect_assocExternal Siteデータの比較にコールバック関数を用い、 追加された添字の確認も含めて配列の共通項を計算する
抽出array_uintersect_uassocExternal Siteデータと添字の比較にコールバック関数を用い、 追加された添字の確認も含めて配列の共通項を計算する
抽出array_uintersectExternal Siteデータの比較にコールバック関数を用い、配列の共通項を計算する
抽出array_uniqueExternal Site配列から重複した値を削除した配列を返す
内部ポインタcurrentExternal Site配列内の現在の要素を返す
内部ポインタeachExternal Site配列から現在のキーと値のペアを返して、カーソルを進める
内部ポインタendExternal Site配列の内部ポインタを最終要素にセットする
内部ポインタkeyExternal Site配列からキーを取り出す
内部ポインタnextExternal Site内部配列ポインタを進める
内部ポインタposExternal Sitecurrent のエイリアス
内部ポインタprevExternal Site内部の配列ポインタをひとつ前に戻す
内部ポインタresetExternal Site配列の内部ポインタを先頭の要素にセットする
変数処理extractExternal Site配列からシンボルテーブルに変数をインポートする

数学的

配列要素の最小値・最大値

数字として解釈できない文字列が要素にある場合は 0 として扱われる

echo min($array);
echo max($array);

配列要素の合計値

echo array_sum($array);

//要素の平均値(配列が空でない場合)
echo (array_sum($array) / count($array));

配列の生成

空配列

  • 要素が空の配列
    $arr = array();

文字列キー

  • 文字列をキーとした配列要素
    $arr = array('x'=>'A' , 'y'=>'B', 'z'=>'C');
    キーxyz
    要素ABC

数値キー

  • 数値キーの自動割り振り
    要素のみ指定してキーを明示しなければ、数値キーが0から1きざみで自動的に割り振られる
    $arr = array('A', 'B', 'C');
    キー012
    要素ABC
    • 数値キーを指定した場合はそこからキーのない要素に1きざみで自動的に割り振られる
      $arr = array(2=>'X','Y','Z');
      キー234
      要素XYZ
  • 数値キーの手動割り振り
    $arr = array(2=>'A' , 5=>'B', 8=>'C');
    キー241
    要素ABC
    • キーと要素が割り振られた順番も保持されるため、
      $arr = array(2=>'A' , 5=>'B', 8=>'C');
      foreach ($arr as $a) echo $a;
      の実行結果はキーの小さい順番(ACB)ではなく、割り振られた順番(ABC)になる。~

範囲指定

  • 整数の要素 2〜3の範囲で構成される配列
    $array = range(2,4);
    キー012
    要素234
  • 文字の要素 C〜E の範囲で構成される配列
    $array = range('C','E');
    キー012
    要素CDE
    ここで取得できる要素は文字列ではなくあくまで文字。
    perlでは ('AC'..'AE') で ('AC','AD','AE') の配列が得られるが、
    phpで range('AC','AE') としても最初の1文字しか認識されず、警告メッセージも出る。

ループ処理

  • 配列 $array の要素を1つずつ $value に受け取る
    foreach ($array as $value){ }
    // 二つは等価
    while (list(, $value) = each($array) ){ }
  • 配列 $array のキーを $key に、要素を $valueに1つずつ受け取る
    while ( list($key, $value) = each($array) ){ }
    // 二つは等価
    foreach ($array as $key => $value){ }

配列情報の取得と表示

$array = array('A', 'b'=>'B', 'C');
var_dump( empty($array) );		// 配列が空もしくは値が0なら真
echo "count:".count($array)."\n";	// 配列の要素数
print_r( array_keys($array) );	// キー配列('0','b','1')
print_r( array_values($array) );	// 要素配列('A','B','C')

$bool = array_key_exists('KEY', $array);	// 配列内に指定キーが存在すれば真

$array = range(0, 26);		// 0から26の要素の配列
$array = range('A', 'Z');		// AからZの要素の配列(半角英数字のみ)

// 配列内に指定した値があれば真を返す。
// 文字列の値の場合、半角英字の大文字小文字は区別しない。
$bool = in_array('XYZ', $array);

$bool = in_array('XYZ', $array,TRUE); // 値の型も厳密に判定する

配列の変換・

$array = key($array);		// 配列のキーを要素とした配列を返す
$array = array_flip($array);	// キーと要素を逆転した配列を返す

$bool = shuffle($array);		// 配列の要素をランダムにかき混ぜる(配列そのものに影響)

配列の結合

  • array_merge($a, $b)
    • 数値キーの要素は 0 から再配置される
    • 重複する数値キーの要素は別の数値キーとして再配置される
    • 重複する文字キーの要素は同じ文字キーとして追加した方で上書きされる
    • 一次元配列のみに対応。要素が配列のリファレンスの場合は読み飛ばされる。
  • array_merge_recursive($a, $b)
    • 数値キーの要素は 0 から再配置される
    • 重複する数値キーの要素は別の数値キーとして再配置される
    • 重複する文字キーの要素は2次元配列化され、再起的に結合される
    • 多次元配列に対応。要素が配列のリファレンスの場合は再起的に配置される。
  • $a + $b
    • 数値キーは保持され、再配置されない。
    • 重複する数値キーの要素は同じ数値キーとして追加した方は無視される
    • 重複する文字キーの要素は同じ文字キーとして追加した方は無視される
    • 一次元配列のみに対応。要素が配列のリファレンスの場合は読み飛ばされる。
$a = array(20=>'A', 'B'=>array('x','y','z'), 'c'=>'x','d'=>'D');
$b = array(20=>'a', 'B'=>'b', 'c'=>'X','e'=>'E');
echo "**** array_merge(\$a,\$b) ****\n";
print_r( array_merge($a, $b) );
echo "**** array_merge_recursive(\$a,\$b) ****\n";
print_r( array_merge_recursive($a, $b) );
echo "**** \$a+\$b ****\n";
print_r( $a + $b );
echo "**** \$b+\$a ****\n";
print_r( $b + $a );

配列の分割

1次元配列を指定長で分割した2次元配列

$arr  = array(0,1,2,3,4,5,6,7,8,9);
$arr2 = array_chunk($arr,3);
var_dump($arr2); // (0,1,2) (3,4,5) (6,7,8) (9)

配列のソート

指定した変数の内容自体を書き換えて整列する。成功すると真を返す。
配列のキーを再配置するものもあるので注意。
整列の判定は変数の型が違う場合は想定外になることも考慮するべき。
またこれらのソート関数は整列した配列を返すのではなく、
入力された配列そのものを整列してしまうことに注意。

  • 配列のソートExternal Site
    -キーと要素の関係評価対象整列方式補足
    sort再配置要素昇順
    rsort再配置要素降順
    asort保持要素昇順
    arsort保持要素降順
    ksort保持キー昇順
    krsort保持キー降順
    natsort保持要素昇順自然順
    natcasesort要素昇順英字の大文字小文字を同一視の自然順
    usort再配置ユーザ定義
    uasort保持ユーザ定義
    uksort保持キーユーザ定義
    $array = array('Z','Y','A','X','C','B');
    
    //配列の要素で昇順ソート(再配置するため、キーと要素の関係は崩れる)
    $true_or_false = sort($array);
    $true_or_false = rsort($array); //降順
    
    //ハッシュの要素で昇順ソート(キーと要素の関係は維持)
    $true_or_false = asort($array);
    $true_or_false = arsort($array); //降順
    
    //ハッシュのキーで昇順ソート
    $true_or_false = ksort($array);
    $true_or_false = krsort($array); //降順

knatsort natksort みたいのがないので自作

キーを自然順ソートする。
uksort と strnatcmp を組み合わせれば簡単にできる。

$arr = array('010'=>'a','5'=>'b','02'=>'c','101'=>'d');
uksort($arr, 'strnatcmp');
print_r($arr);
  • 結果
    Array
    (
        [02] => c
        [5] => b
        [010] => a
        [101] => d
    )

配列の探索

  • 配列のソートExternal Site
    -探索対象半角英字の
    大小を区別
    返り値補足
    in_array($needle,$array,$strict)配列の要素×真偽値
    array_search($needle, $array,$strict)配列の要素最初に見つけた要素のキーorFALSE
    array_keys($array,$needle,$strict)配列の要素見つけたすべての要素のキーor空配列
//半角英字の大文字小文字を区別しない
//戻り値は探索文字列を配列の値にあればTRUEを、なければFALSEを返す
//$strictを真にすると値の型も比較する。
bool in_array($needle,$array,$strict)

//半角英字の大文字小文字を区別する
//戻り値は最初に見つけた配列の値に対応したキーを、
//見つからなければFALSEを返す
mixied array_search($needle, $array,$strict)

//半角英字の大文字小文字を区別する
//戻り値は見つけた配列の値に対応したすべてのキーを、
//見つからなければ空配列を返す
array array_keys($array,$needle,$strict)

配列の値に対応するキーを取得する

<?php
$arr = array('1', '2', '3', 1, 2, 3, '2z');
var_dump(
	//配列内に値「2」が存在すれば真を返す。
	in_array(2, array(2)),
	in_array(2, array('2')),
	in_array(2, array('2z')),

	//配列内の値「2」が最初に見つかった場所のキーを返す。
	array_search(2, array(1,2,3,'2')),
	array_search(2, array(1,'2',3,2)),
	array_search(2, array(1,'2z',3,2)),

	//配列内の値「2」が見つかった場所のキーをすべて返す。
	array_keys(array(1,2,3,'2'), 2),
	array_keys(array(1,'2',3,2), 2),
	array_keys(array(1,'2z',3,2), 2)
);
?>
実行結果
変数の型が厳密でないため、数値の2を探索しても
文字列の '2' や暗黙の型変換で 2 にされる '2a' も抽出されている。
bool(true)
bool(true)
bool(true)
int(1)
int(1)
int(1)
array(2) {
  [0]=>
  int(1)
  [1]=>
  int(3)
}
array(2) {
  [0]=>
  int(1)
  [1]=>
  int(3)
}
array(2) {
  [0]=>
  int(1)
  [1]=>
  int(3)
}

配列の値に対応するキーを厳密に取得する

<?php
$arr = array('1', '2', '3', 1, 2, 3, '2z');
var_dump(
	//配列内に値「2」が存在すれば真を返す。
	in_array(2, array(2),TRUE),
	in_array(2, array('2'),TRUE),
	in_array(2, array('2z'),TRUE),

	//配列内の値「2」が最初に見つかった場所のキーを返す。
	array_search(2, array(1,2,3,'2'),TRUE),
	array_search(2, array(1,'2',3,2),TRUE),
	array_search(2, array(1,'2z',3,2),TRUE),

	//配列内の値「2」が見つかった場所のキーをすべて返す。
	array_keys(array(1,2,3,'2'), 2,TRUE),
	array_keys(array(1,'2',3,2), 2,TRUE),
	array_keys(array(1,'2z',3,2), 2,TRUE)
);
?>
実行結果
変数の型判定を厳密にするフラグを指定したので
数値の2を探索しても文字列の '2' や暗黙の型変換で 2 にされる '2a' は抽出されない。
bool(true)
bool(false)
bool(false)
int(1)
int(3)
int(3)
array(1) {
  [0]=>
  int(1)
}
array(1) {
  [0]=>
  int(3)
}
array(1) {
  [0]=>
  int(3)
}

ある文字列の中に配列内の部分文字列があるか探索

$talk = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
$blacklist = array('xyz','XYZ');

//ブラックリストに該当するワードを含んでいればNG
if( array_strpos($talk,$blacklist) )
	echo "NG\n";

// 配列 $needles の要素のどれか1つが $haystack の部分文字列なら真
function array_strpos($haystack,$needles,$offset=0){
	foreach ($needles as $n){
		if( strpos($haystack,$n,$offset) !== FALSE )
			return TRUE;
	}
	return FALSE;
}

配列の抽出

先頭/末尾からn個抜き出し

$a = array('a','b','c','d','e','f');
print_r( array_slice($a, 0,3) ); // 先頭から3個 a,b,c
print_r( array_slice($a, -3) );  // 末尾から3個 d,e,f

print_r( array_slice($a, 2) );    // 2番目(0オリジン)から末尾まで c,d,e,f
print_r( array_slice($a, 0,-2) ); // 先頭から末尾の2つ前まで a,b,c,d

配列の同じ要素を除外したもの(ユニーク要素)

//一つの配列内の重複しない要素を抽出
print_r( array_unique($a) );
// => a,b,c

2つ以上の配列の同じ要素/異なる要素を抽出

$a = array('a','b','c','a','b');
$b = array('b','c','d');

//複数の配列の要素との差($a の要素から $b の要素を除外したもの)
//以降に配列$c,$d,$eをつけると順番にそれらの要素を含まないものとなる
print_r( array_diff($a,$b) );
// => a,a

//複数の配列の要素との共通項($a の要素と $b の要素にあるもの)
//以降に配列$c,$d,$eをつけると順番にそれらの要素にもあるものとなる
print_r( array_intersect($a,$b) );
// => b,c,b

2つ以上の配列の同じキー/異なるキーを抽出

対象がキーになるだけで要素の場合と手順は同じ。

$a = array(0=>'a', 1 =>'b','c'=>'C','d'=>'d',2=>'e');
$b = array(0=>'A','b'=>'B','c'=>'C', 2 =>'D',3=>'E');
//複数の配列の数値キーとの差
print_r( array_diff_key($a,$b) );
// => [1]=>b,[d]=>d

//複数の配列の数値キーとの共通項
print_r( array_intersect_key($a,$b) );
// => [0]=>a,[c]=>C,[2]=>e
 
//複数の配列の文字列キーとの差
print_r( array_diff_assoc($a,$b) );
// => [0]=>a,[1]=>b,[d]=>d,[2]=>e

//複数の配列の文字列キーとの共通項
print_r( array_intersect_assoc($a,$b) );
// => [c]=>C

grep(正規表現にマッチするもの)

//正規表現にマッチする配列の要素を抽出する
$arr = preg_grep('/[0-9]/', $arr);

//正規表現にマッチしない配列の要素を抽出する
$arr = preg_grep('/[0-9]/', $arr, PREG_GREP_INVERT);

コールバック関数による配列の一括処理

array_filter と array_map はコールバック関数の引数の場所が違うので注意。

array_map コールバック関数を要素毎に実行して返す

array_map は第一引数に指定した名前の関数、もしくはクロージャ(無名関数)オブジェクトを
第二引数以降に指定した配列を関数に渡して実行し結果を配列で返す。
第二引数以降の配列はそれぞれ同じ長さでなければならない。

//配列中の文字列を大文字にする
$arr = array_map('strtouppser',$arr);

//2つの配列の大文字小文字を区別しない比較結果を配列で返す
$icmp = function ($a,$b){ //比較無名関数
	$a = strtoupper($a);
	$b = strtoupper($b);
	if( $a == $b ) return 0;
	return ($a > $b ? 1 : -1);
}; //無名関数の終端にはセミコロン必須
$a = array('A','b','C');
$b = array('A','a','x');
print_r( array_map($icmp, $a,$b) );	// 0,1,-1

array_filter コールバック関数による要素の抽出

要素毎にコールバック関数の返り値が真なら格納して返す。
関数が未指定でで array_filter を実行すると要素の比較演算で真となるものだけを返す。
ただし文字列の '0' も偽となるため注意が必要。
0 以外を返したり、空文字列以外を返すなどのことができる。

$arr = array('0','1',0,1,'',' ',false,true,null,'ABC');
$arr = array_filter($arr);
var_dump($arr);
//配列から文字列のみを抽出。
$arr = array('a','b',0,'c',4,'D',-1);
print_r( array_filter($arr, 'is_string') );
//数字もしくは16進数文字列を抽出
$arr = array('a','02','0a','24',23,'0x44');
print_r( array_filter($arr, 'is_numeric') );

配列内部ポインタ使用

$array = range('A','Z');	//要素A〜Zの配列
echo current($array).':key='.key($array)."\n";	//current 現在の要素を返す。配列内部ポインタは変化なし。
						//key     現在のキーを返す。配列内部ポインタは変化無し。
echo reset($array).':key='.key($array)."\n";	//reset   先頭要素。配列内部ポインタを先頭に設定。
echo next($array).':key='.key($array)."\n";	//next    現在より1つ後の要素を返す。配列内部ポインタ+1
echo end($array).':key='.key($array)."\n";		//end     末尾の要素を返す。配列内部ポインタを末尾に設定。
echo prev($array).':key='.key($array)."\n";	//prev    現在より1つ前の要素を返す。配列内部ポインタ-1
print_r( each($array) );	//キーと要素からなる配列を返す。配列内部ポインタ+1
  • 実行結果
    A:key=0
    A:key=0
    B:key=1
    Z:key=25
    Y:key=24
    Array
    (
        [1] => Y
        [value] => Y
        [0] => 24
        [key] => 24
    )

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規新規下位 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2013-05-16 (木) 15:39:14 (1591d)