▼ array()を使って配列作成 $array = array(1, 2, 3); 作成した配列は、$array[0]のようにして値を参照できる。 配列の要素は0番目から始まるので$array[0], $array[1], $array[2]と続くことになる。 ▼ 要素ごとに代入して配列作成 $array[0] = 'これは0番目要素'; $array[1] = 'これは1番目要素'; $array[2] = 'これは2番目要素'; ▼ 要素ごとに代入して配列作成(その2) $array[] = 'これは0番目要素'; $array[] = 'これは1番目要素'; $array[] = 'これは2番目要素'; 0番目要素から始まる一般の配列の他に、連想配列がある。 一般の配列は0番目要素から順番につづいていくが、連想配列はキー(文字列)とその値のペアになっていて、一般の配列との間に扱い方に違いはない。 ▼ 連想配列の作成 // array()を使って作成 $hash = array('一' => '富士', '二' => '鷹', '三' => 'なすび'); // 要素ごとに代入して作成 $hash['一'] = '富士'; $hash['二'] = '鷹'; $hash['三'] = 'なすび'; ▼ 連続の値を持つ配列の作成 $array = range(1, 5); // 1, 2, 3, 4, 5 $array = range(1, 10, 2); // 1, 3, 5, 7, 9 $array = range('a', 'f'); // 'a', 'b', 'c', 'd', 'e', 'f' ▼ 同じ値を持つ配列の作成 $array = array_fill(0, 3, 'foo'); // "foo", "foo", "foo" $array = array_pad(array(), 3, 'foo'); // "foo", "foo", "foo" 同じ値で配列を生成と同時に初期化する場合に便利
作成した配列は、$array[0]のようにして値を参照できる。 配列の要素は0番目から始まるので$array[0], $array[1], $array[2]と続くことになる。
0番目要素から始まる一般の配列の他に、連想配列がある。 一般の配列は0番目要素から順番につづいていくが、連想配列はキー(文字列)とその値のペアになっていて、一般の配列との間に扱い方に違いはない。
同じ値で配列を生成と同時に初期化する場合に便利
▼ is_array() 配列データかどうかをチェック $array = array(); if (is_array($array)) echo 'これは配列です。'; ▼ count() 配列の要素数を得る $array = array('foo', 'bar', 'fuga', 'hoge'); $n = count($array); echo "要素数は{$n}個です。"; // 4 sizeof()はエイリアス ▼ isset()とarray_key_exists() 要素の有無をチェック $key = 'foo'; if (isset($array[$key])) echo "この要素は未定義でもnullでもない"; if (array_key_exists($key, $array)) echo "この要素は未定義ではない"; isset()とarray_key_exists()の違いは、isset()がnull値も偽扱いするのに対し、array_key_exists()は値がnullでも定義されていれば真として扱う。 ▼ in_array()とarray_search() 配列に値があるかチェック $array = array(1, 3, 5); if (in_array(5, $array)) echo "5がありました。"; if (in_array(5, $array, true)) echo "5がありました。(型もチェック)"; if (($key=array_search(5, $array)) !== false) echo "キーが{$key}の値が5です。"; array_search()関数では、最初に値が一致したキーを1つだけ返すので、一致するキー全部を取得するには$sub = array_keys($array, 5)とする必要がある。 ▼ preg_grep() パターンに該当する要素を取得する。 $array = preg_grep('/pattern/', $array); $array = preg_grep('/pattern/', $array, PREG_GREP_INVERT); // マッチしないもの
配列データかどうかをチェック
配列の要素数を得る
sizeof()はエイリアス
要素の有無をチェック
isset()とarray_key_exists()の違いは、isset()がnull値も偽扱いするのに対し、array_key_exists()は値がnullでも定義されていれば真として扱う。
配列に値があるかチェック
array_search()関数では、最初に値が一致したキーを1つだけ返すので、一致するキー全部を取得するには$sub = array_keys($array, 5)とする必要がある。
パターンに該当する要素を取得する。
配列参照用にforeachループがある。 ▼ 配列のキーと値を参照 $array = array(1, 3, 5); foreach ($array as $key => $value) { echo "$key: $value\n"; // "0: 1", "1: 3", "2: 5" } foreach ($array as $value) { echo "$value\n"; // "1", "3", "5" } $hash = array('一' => '富士', '二' => '鷹', '三' => 'なすび'); foreach ($hash as $key => $value) { echo "$key: $value\n"; // "一: 富士", "二: 鷹", "三: なすび" } foreach ($hash as $value) { echo "$value\n"; // "富士", "鷹", "なすび" } foreachループにおいて、「キーと値」または「値のみ」を参照することができます。 "as"はforeachループのみで使用するキーワードになります。 ▼ 配列のキーのみを参照 $array = array(1, 3, 5); foreach (array_keys($array) as $key) { echo "$key\n"; // "0", "1", "2" } $hash = array('一' => '富士', '二' => '鷹', '三' => 'なすび'); foreach (array_keys($hash) as $key) { echo "$key\n"; // "一", "二", "三" } array_keys()関数を使ってキーを値とする配列を生成しています。その新しく生成した配列の値を参照していることになります。 ただし、新たな配列を生成しているのでコストを考えたら以下のように「$key => $value」を使って$valueを無視した方がいいような気がする。 ▼ 配列のキーのみを参照(その2) foreach ($array as $key => $value) { // $valueを無視して$keyのみを使う } foreach ($array as $key => &$value) { // PHP5以降で使えるリファレンスを使うことでもし$value値が膨大でも負荷にならない } もしも配列の値が膨大なデータだとかなりの量のデータコピーが頻発してロスが生じる。 こういう場合はできればリファレンスを使うことも考えた方がよい。
配列参照用にforeachループがある。
foreachループにおいて、「キーと値」または「値のみ」を参照することができます。
"as"はforeachループのみで使用するキーワードになります。
array_keys()関数を使ってキーを値とする配列を生成しています。その新しく生成した配列の値を参照していることになります。
ただし、新たな配列を生成しているのでコストを考えたら以下のように「$key => $value」を使って$valueを無視した方がいいような気がする。
もしも配列の値が膨大なデータだとかなりの量のデータコピーが頻発してロスが生じる。 こういう場合はできればリファレンスを使うことも考えた方がよい。
array()による配列生成時は変数に代入する方法で配列を受け取る $array = array(1, 3, 5); array()は関数ではなくて言語構造ではあるが、配列を返す関数の場合でも変数への代入の形で受け取ることができる。 $array = func(); function func() { return array(1, 3, 5); } その他、list()を使って配列を受け取る方法がある。 list($x, $y, $z) = func(); function func() { return array(1, 3, 5); } list()を使う場合には、返ってくる配列の要素数があらかじめ分かっている場合じゃないと使えない。 もしも要素数が想定よりも少なかった場合には「Notice: Undefined offset: 2 in /path/to/filename on line N」のような警告が表示される。 $s = 'aaa,bbb'; list($x, $y, $z) = explode(',', $s, 3); // 3分割を試みるも最大2分割しかならずに警告 次は必要な要素だけを受け取る。不要な代入(データコピー)を行わない分軽くなる。 $s = 'aaa,bbb,ccc'; list(,,$z) = explode(',', $s, 3); // "ccc" その他複雑な配列を、ネストにしたlist()で受け取る方法があります。 list($x, list($y, $z)) = array(1, array(3, 5));
array()による配列生成時は変数に代入する方法で配列を受け取る
array()は関数ではなくて言語構造ではあるが、配列を返す関数の場合でも変数への代入の形で受け取ることができる。
その他、list()を使って配列を受け取る方法がある。
list()を使う場合には、返ってくる配列の要素数があらかじめ分かっている場合じゃないと使えない。
もしも要素数が想定よりも少なかった場合には「Notice: Undefined offset: 2 in /path/to/filename on line N」のような警告が表示される。
次は必要な要素だけを受け取る。不要な代入(データコピー)を行わない分軽くなる。
その他複雑な配列を、ネストにしたlist()で受け取る方法があります。
配列の削除は、「要素ごとの削除」と「配列全体の削除」がある。 ▼ unset() $array = array(1, 3, 5); unset($array[1]); // 1要素を削除 foreach ($array as $key => $value) { echo "$key: $value\n"; // "0: 1", "2: 5" } $array[] = 100; // 要素を追加 foreach ($array as $key => $value) { echo "$key: $value\n"; // "0: 1", "2: 5", "3: 100" } unset($array); // 全部を削除 foreach ($array as $key => $value) { echo "$key: $value\n"; // 未定義のものを参照した時の警告が出る } 削除と書いたが、実際には変数の割り当てを解除とか変数の破棄とかの表現をされている。 unset($array[0], $array[2])とすれば飛び飛びで要素削除を行うこともできる。 ▼ array() $array = array(1, 3, 5); $array = array(); // 空の配列を生成して代入 foreach ($array as $key => $value) { echo "$key: $value\n"; // unset()と違って空の配列があるので警告なし } 新たに生成した空の配列を代入している。 形としてはunset()同様にすべての要素を削除した感じになる。 ▼ array_shift() $array = array(1, 3, 5); $s = array_shift($array); // 先頭要素を抜き出す foreach ($array as $key => $value) { echo "$key: $value\n"; // "0: 3", "1: 5" } 先頭要素を抜き出して返します。その結果、配列は新しい0番目の要素から始まるようにスライドしています。 これとは逆に、先頭要素に追加するarray_unshift()関数がある。 ▼ array_pop() $array = array(1, 3, 5); $s = array_pop($array); foreach ($array as $key => $value) { echo "$key: $value\n"; // "0: 1", "1: 3" } 末尾要素を抜き出して返します。その結果、配列は末尾要素が抜き取られて消えています。 これとは逆に、末尾要素に追加するarray_push()関数があるが、$array[] = 'foo'で追加した方が速い。 ▼ array_splice() $array = array(1, 3, 5, 7, 9); $sub = array_splice($array, 3); // 0から始まる3番目要素以降を抜き取る foreach ($array as $key => $value) { echo "$key: $value\n"; // "0: 1", "1: 3", "2: 5" } foreach ($sub as $key => $value) { echo "$key: $value\n"; // "0: 7", "1: 9" } $array = array(1, 3, 5, 7, 9); $sub = array_splice($array, 1, 2); // 0から始まる1番目要素から2つを抜き取る foreach ($array as $key => $value) { echo "$key: $value\n"; // "0: 1", "1: 7", "2: 9" } foreach ($sub as $key => $value) { echo "$key: $value\n"; // "0: 3", "1: 5" } 配列の部分要素を抜き出す。その結果、元の配列は部分要素が抜き取られている。
配列の削除は、「要素ごとの削除」と「配列全体の削除」がある。
削除と書いたが、実際には変数の割り当てを解除とか変数の破棄とかの表現をされている。
unset($array[0], $array[2])とすれば飛び飛びで要素削除を行うこともできる。
新たに生成した空の配列を代入している。 形としてはunset()同様にすべての要素を削除した感じになる。
先頭要素を抜き出して返します。その結果、配列は新しい0番目の要素から始まるようにスライドしています。
これとは逆に、先頭要素に追加するarray_unshift()関数がある。
末尾要素を抜き出して返します。その結果、配列は末尾要素が抜き取られて消えています。
これとは逆に、末尾要素に追加するarray_push()関数があるが、$array[] = 'foo'で追加した方が速い。
配列の部分要素を抜き出す。その結果、元の配列は部分要素が抜き取られている。
フィルターとは、条件に合う要素を抽出すること ▼ array_filter() 条件判定用のコールバック関数を作る(真か偽を返す) // コールバック関数 function filter($s) { return $s < 10; } // フィルターを通した結果を得る $array = array(5, 8, 12, 34); $sub = array_filter($array, "filter"); // 5, 8 一度しか呼ばないようなコールバック関数を定義するのが見通しが悪くなるようならcreate_function()関数で定義した匿名関数を直接渡せばよい。 ▼ array_unique() 配列から重複した値を削除する $array = array(1, 3, 5, 'one' => 'fuji', 3, 2, 1); $sub = array_unique($array); foreach ($sub as $key => $value) { echo "$key: $value"; // "0: 1" "1: 3" "2: 5" "one: fuji" "4: 2" } キーと値の関係は維持されている。
フィルターとは、条件に合う要素を抽出すること
条件判定用のコールバック関数を作る(真か偽を返す)
一度しか呼ばないようなコールバック関数を定義するのが見通しが悪くなるようならcreate_function()関数で定義した匿名関数を直接渡せばよい。
配列から重複した値を削除する
キーと値の関係は維持されている。
▼ array_walk() 配列の全ての要素にユーザ関数を適用する // ユーザ定義関数(第一引数は値、第二引数はキーと決まっている) function alter(&$item, $key, $prefix) { // 元の値が変わるようにリファレンス渡し $item = $prefix . $item; } $array = array("one", "two", "three"); array_walk($array, "alter", "foo_"); echo $array[0]; // "foo_one" ▼ array_map() 指定した配列の要素にコールバック関数を適用する function foo($s) { return $s . $s; } $array = array(1, 3, 5); $sub = array_map("foo", $array); echo $sub[0]; // "11" array_walk()との違いは、結果を配列で取得できること 要素数の同じ複数の配列を並列に処理することもできる。 function func1($s, $t) { return $s . "+" . $t; } function func2($s, $t) { return array($s => $t); } $array1 = array(1, 3, 5); $array2 = array("foo", "bar", "fuga"); $sub1 = array_map("func1", $array1, $array2); $sub2 = array_map("func2", $array1, $array2); echo $sub1[0]; // "1+foo" echo $sub2[0][1]; // "foo" その他、第一引数をnullとすることにより配列の配列を生成できる。 $array1 = array(1, 3, 5); $array2 = array("foo", "bar", "fuga"); $sub = array_map(null, $array1, $array2); echo $sub[0][0]; // 1 echo $sub[0][1]; // "foo" echo $sub[1][1]; // "bar" echo $sub[2][1]; // "fuga"
配列の全ての要素にユーザ関数を適用する
指定した配列の要素にコールバック関数を適用する
array_walk()との違いは、結果を配列で取得できること
要素数の同じ複数の配列を並列に処理することもできる。
その他、第一引数をnullとすることにより配列の配列を生成できる。
▼ array_reverse() 要素を逆順にした配列を返す foreach (array_reverse(array(1, 3, 5)) as $value) { echo $value; // 5, 3, 1 } ▼ shuffle() 配列をシャッフルする $array = array(1, 3, 5, 7, 9); shuffle($array); foreach ($array as $value) { echo $value; // 例えば7, 3, 5, 1, 9 } ▼ asort()とarsort() 連想キーと要素との関係を維持しつつ配列をソートする $array = array("one" => "fuji", "two" => "taka", "three" => "nasubi"); asort($array); // 昇順 foreach ($array as $key => $value) { echo "$key: $value"; // "one: fuji" "three: nasubi" "two: taka" } arsort($array); // 降順 foreach ($array as $key => $value) { echo "$key: $value"; // "two: taka" "three: nasubi" "one: fuji" } 値に関してアルファベット順にソート ▼ ksort()とkrsort() 配列をキーでソートする $array = array("one" => "fuji", "two" => "taka", "three" => "nasubi"); ksort($array); // 昇順 foreach ($array as $key => $value) { echo "$key: $value"; // "one: fuji" "three: nasubi" "two: taka" } krsort($array); // 降順 foreach ($array as $key => $value) { echo "$key: $value"; // "two: taka" "three: nasubi" "one: fuji" } キーに関してアルファベット順にソート ▼ sort()とrsort() 配列をソートする $array = array("one" => "fuji", "two" => "taka", "three" => "nasubi"); sort($array); // 昇順 foreach ($array as $key => $value) { echo "$key: $value"; // "0: fuji" "1: nasubi" "2: taka" } rsort($array); // 降順 foreach ($array as $key => $value) { echo "$key: $value"; // "0: taka" "1: nasubi" "2: fuji" } キーを無視して、値に関してアルファベット順にソートし配列の0番目から再割り当てを行う。
要素を逆順にした配列を返す
配列をシャッフルする
連想キーと要素との関係を維持しつつ配列をソートする
値に関してアルファベット順にソート
配列をキーでソートする
キーに関してアルファベット順にソート
配列をソートする
キーを無視して、値に関してアルファベット順にソートし配列の0番目から再割り当てを行う。
▼ array_rand() 配列から一つ以上の要素をランダムに取得する $n = array_rand(array(1, 3, 5, 7, 9)); // どれか一つが返る $array = array_rand(array(1, 3, 5, 7, 9), 3); // 三つが返る 注意すべきは、値ではなくてキー(添え字)が返されること。 ▼ array_slice() 配列の一部を展開する $array = array(1, 3, 5, 7, 9); $sub = array_slice($array, 0); // 1 3 5 7 9 $sub = array_slice($array, -2); // 7 9 $sub = array_slice($array, 1, 3); // 3 5 7 ▼ implode() 配列の値を連結して一つの文字列として返す $array = array('Hello', 'my', 'friend'); echo implode(" ", $array); // "Hello my friend" echo implode($array); // "Hellomyfriend" キーがあっても無視される。 join()はエイリアス
配列から一つ以上の要素をランダムに取得する
注意すべきは、値ではなくてキー(添え字)が返されること。
配列の一部を展開する
配列の値を連結して一つの文字列として返す
キーがあっても無視される。
join()はエイリアス