LoginSignup
5
5

More than 5 years have passed since last update.

配列関数

Posted at

未だに配列関数を上手に使えないので自分なりにまとめ

array_filter

コールバック関数を使用して、配列の要素をフィルタリングする

array array_filter ( array $array [, callable $callback [, int $flag = 0 ]] )

$callbackの関数で$arrayの配列をフィルタリングし、結果がtrueの場合に$arrayの現在の値が結果の配列に入る。連想配列の場合キーは保持。
※コールバック関数は真偽を返すものである必要がある

array_filter
function odd($num){
  //奇数かどうかを返す
  return($num & 1);
}

function even($num){
  //偶数かどうかを返す
  return(!($num & 1));
}

$arr = [1,2,3,4,5];
print_r(array_filter($arr,"odd"));
/*
Array
(
    [0] => 1
    [2] => 3
    [4] => 5
)
*/

print_r(array_filter($arr,"even"));
/*
Array
(
    [1] => 2
    [3] => 4
)
*/

array_map

指定した配列の要素にコールバック関数を適用する

array array_map ( callable $callback , array $array1 [, array $... ] )

$array1 の各要素に $callbackの関数を適用した後、 その全ての要素を含む配列を返す。array_mapに渡される配列の数と、$callbackが受け付けるパラメータの数は一致している必要がある。

2つ以上の配列を使う時、配列の長さは等しい必要がある。
もし長さが違った場合は、短い方を空の要素で埋めて、長い方に合わせる。

array_map
function en($n,$m){
    return ($n."は英語で【".$m."】です。");
}

function fr($n,$m){
    return ($n."はフランス語で【".$m."】です。");
}

$arr1 = [1,2,3,4,5,6];
$arr2 = ["one","two","three","four","five","six"];
$arr3 = ["un","deux","trois","quatre","cinq"];

print_r(array_map("en",$arr1,$arr2));
/*
Array
(
    [0] => 1は英語で【one】です。
    [1] => 2は英語で【two】です。
    [2] => 3は英語で【three】です。
    [3] => 4は英語で【four】です。
    [4] => 5は英語で【five】です。
    [5] => 6は英語で【six】です。
)
*/

print_r(array_map("fr",$arr1,$arr3));
/*
Array
(
    [0] => 1はフランス語で【un】です。
    [1] => 2はフランス語で【deux】です。
    [2] => 3はフランス語で【trois】です。
    [3] => 4はフランス語で【quatre】です。
    [4] => 5はフランス語で【cinq】です。
    [5] => 6はフランス語で【】です。//$arr3の要素は5つしかないので【】の中は空になる
)
*/

配列の配列を生成

コールバック関数の名前としてNULLを用いることで配列の配列を構築することができる1

array_map
print_r(array_map(null,$arr1,$arr2,$arr3));

/*
Array
(
    [0] => Array
        (
            [0] => 1
            [1] => one
            [2] => un
        )
    [1] => Array
        (
            [0] => 2
            [1] => two
            [2] => deux
        )
    [2] => Array
        (
            [0] => 3
            [1] => three
            [2] => trois
        )
    [3] => Array
        (
            [0] => 4
            [1] => four
            [2] => quatre
        )
    [4] => Array
        (
            [0] => 5
            [1] => five
            [2] => cinq
        )
    [5] => Array
        (
            [0] => 6
            [1] => six
            [2] => 
        )
)
*/

array_merge

ひとつまたは複数の配列をマージする

array array_merge ( array $array1 [, array $... ] )

キーが同じ文字列の場合は後ろの値2で上書き 。
キーが数字の場合は0から振りなおされて値は追記される。

array_merge
$ar1 = array("color" => array("favorite" => "red"), 5);
$ar2 = array(10, "color" => array("favorite" => "green", "blue"));

print_r(array_merge_recursive($ar1, $ar2));
/*
Array
(
    [color] => Array
        (
            [favorite] => green //$ar1["color"]["favorite"]の"red"が上書きされてなくなる
            [0] => blue //$ar2["color"][0]の値が追記
        )

    [0] => 5 //$ar1[0]
    [1] => 10 //$ar2[0]
)
*/

array_merge_recursive

二つ以上の配列を再帰的にマージする

array array_merge_recursive ( array $array1 [, array $... ] )

キーが同じ文字列の場合は一つの配列にまとめられる。
キーが数字の場合は0から振りなおされて値は追記される。

array_merge_recursive
$ar1 = array("color" => array("favorite" => "red"), 5);
$ar2 = array(10, "color" => array("favorite" => "green", "blue"));

print_r(array_merge_recursive($ar1, $ar2));
/*
Array
(
    [color] => Array
        (
            [favorite] => Array
                (
                    [0] => red     //$ar1["color"]["favorite"]
                    [1] => green   //$ar2["color"]["favorite"]
                )

            [0] => blue //$ar2["color"][0]
        )

    [0] => 5  //$ar1[0]
    [1] => 10 //$ar2[0]
)
*/

  1. Pythonとかだとzip関数というものがあるらしい 

  2. 最初の値を残したい場合は配列結合演算子+を使う。 

5
5
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
5
5