・IT/Web系エンジニアの経験者の方
・どこの転職エージェントを利用しようか迷っている方
それなら、キッカケエージェントにご相談!
キッカケエージェントでは、少数精鋭のエージェントが、エンジニアの経験やスキル、志向性などをカウンセリングし、的確なアドバイスを提供します!
また、徹底した企業へのヒアリングにより、最適なマッチングを実現し、今では内定率が一般的なエージェントの2倍以上となっています!
転職エージェントに迷っている方、まずは無料でキャリア相談から!
(この記事は2023年05月6日に投稿されました。)
PHPで指定した配列や連想配列をベースに新しい配列を作成する作成する方法として、array_map()があります。
array_map()とは、指定したイテレータ元に新たなイテレータを作成することができる関数になります。
新たなイテレータを作成することから、配列や連想配列が返されるようになります。
そして、array_map()で元の配列だけでなく、他の配列を引数として指定することができ、新しく配列を作成するための材料として使用することができます。
このように、配列の操作はプログラミングで開発を行う場合に使用する機会が多いため、配列や連想配列を元に新しい配列を作成する場合はarray_map()を使用しましょう。
今回はPHPのarray_map()で元の配列や連想配列から新しい配列を作成する方法について紹介していきます。
・ある連想配列を材料にして新しい連想配列を作成したい場合
array_map()とは
array_map()とは指定したイテレータ元に新たなイテレータを作成することができる関数となります。
イテレータであるため、配列や連想配列にも使用することができます。
array_map()の書き方
array_map()の書き方は下記のようになります。
1 | array_map(コールバック関数, 対象の配列 [, 他の配列]) |
array_map()と記述し、括弧の中に必須の引数を2つ追記すると使用することができます。
そして、任意にはなりますが3つ目に引数を指定しても使用が可能です。
また、下記のような書き方でも問題ありません。
1 2 3 | array_map(function(変数){ // 処理内容 }, 対象の配列 [,他の配列, ...]); |
引数に変わりはありませんが、array_map()の括弧の中にコールバック関数の処理を直接指定しても可能です。
array_map()の引数
array_map()の引数は下記のようになります。
- コールバック関数(必須):
配列に対して処理を行うための関数を指定する - 対象の配列(任意):
元となる配列を指定する - 他の配列(任意):
コールバック関数で使用するための配列を指定する
array_map()は必須な引数として「コールバック関数」と「対象の配列」を指定します。
また、任意な引数として「他の配列」を指定することができます。
array_map()の返り値
array_map()の返り値は指定したイテレータを元に新しく作成された配列となります。
また、渡した配列がひとつだけである場合は、引数で渡した配列のキーがそのまま維持されるようになります。
しかし、複数の配列を渡した場合の戻り値の配列キーは、整数値として新しく振り直されるようになります。
array_map()で配列を元に新たな配列を作成するサンプルコード
array_map()で配列を元に新たな配列を作成するサンプルコードをご紹介します。
ここでは下記の2つのパターンでarray_map()を使用します。
- 配列に要素が存在する場合
- 配列に要素が存在しない場合
配列に要素が存在する場合
配列に要素が存在する場合にarray_map()を使用すると、配列を元に新たな配列を作成します。
● index.php
1 2 3 4 5 6 7 8 9 10 11 12 13 | <?php print_r("● 対象の配列"); $numArr = [25, 28, 33, 46, 50]; print_r($numArr); print_r("● array_map()使用後"); $result = array_map("plus", $numArr); print_r($result); function plus($num) { return $num + $num; } ?> |
実行結果
array_map()で要素が存在する配列に対して処理を行っています。
そのため、それぞれの値を足した値の配列が表示されています。
配列に要素が存在しない場合
配列に要素が存在しない場合にarray_map()を使用すると、空の配列を作成します。
● index.php
1 2 3 4 5 6 7 8 9 10 11 12 13 | <?php print_r("● 対象の配列"); $numArr = []; print_r($numArr); print_r("● array_map()使用後"); $result = array_map("plus", $numArr); print_r($result); function plus($num) { return $num + $num; } ?> |
実行結果
array_map()で要素が存在しない配列に対して処理を行っています。
そのため、空の配列が表示されています。
array_map()で連想配列を元に新しい配列を作成するサンプルコード
array_map()で連想配列を元に新たな配列を作成するサンプルコードをご紹介します。
ここでは下記の2つのパターンでarray_map()を使用します。
- 値を元に新しい配列を作成する場合
- キーを元に新しい配列を作成する場合
値を元に新しい配列を作成する場合
値を元に新しい配列を作成する場合は、array_map()を連想配列に対してそのまま使用します。
連想配列を指定するため、array_map()で作成される配列も連想配列となります。
● index.php
1 2 3 4 5 6 7 8 9 10 11 12 13 | <?php print_r("● 対象の連想配列"); $numArr = array("one" => 200, "two" => 150, "three" => 300); print_r($numArr); print_r("● array_map()使用後"); $result = array_map("multi", $numArr); print_r($result); function multi($num) { return $num * 2; } ?> |
実行結果
array_map()で値を元に新しい配列を作成しています。
そのため、それぞれの値に2をかけた数値の配列が表示されています。
キーを元に新しい配列を作成する場合
値キーを元に新しい配列を作成する場合は、array_keys()でキー取り出した配列に対してarray_map()を使用します。
キーを変更するため、元の連想配列とは異なる配列が作成されるようになります。
● index.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | <?php print_r("● 対象の連想配列"); $numArr = array("one" => 200, "two" => 150, "three" => 300); print_r($numArr); print_r("● array_map()使用後"); $numArrKey = array_keys($numArr); print_r($numArrKey); $result = array_map("plus", $numArrKey); print_r($result); function plus($key) { $pKey = "key: ".$key; return $pKey; } ?> |
実行結果
array_map()でキーを元に新しい配列を作成しています。
そのため、それぞれのキーの前に「key:」という値が挿入された配列が表示されています。
array_map()で多次元配列/連想配列を元に新しい配列を作成するサンプルコード
array_map()で多次元配列/連想配列を元に新しい配列を作成するサンプルコードをご紹介します。
多次元配列の場合
array_map()を多次元配列に対して使用します。
● index.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | <?php print_r("● 対象の多次元配列"); $preArr = [ ["岩手", "宮城", "新潟", "秋田", "福島"], ["群馬", "茨城", "埼玉", "神奈川", "静岡"] ]; print_r($preArr); print_r("● array_map()使用後"); $result = array_map("changePre", $preArr); print_r($result); function changePre($preName) { $prefecture = array_map("addKen", $preName); return $prefecture; } function addKen($preName) { $kenName = $preName."県"; return $kenName; } ?> |
実行結果
array_map()で多次元配列を元に新たな配列を作成しています。
そのため、それぞれの値の後ろに「県」がついた多次元配列が表示されています。
多次元連想配列の場合
array_map()を多次元連想配列に対して使用します。
● index.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | <?php print_r("● 対象の多次元連想配列"); $colorArray = array( "fruit" => array( "red" => "リンゴ", "orange" => "オレンジ" ), "SouthFfuit" => array( "pink" => "ドラゴンフルーツ", "yellow" => "バイナップル" ) ); print_r($colorArray); print_r("● array_map()使用後"); $result = array_map("changeText", $colorArray); print_r($result); function changeText($array) { $addedval = array_map("addText", $array); return $addedval; } function addText($val) { $val = $val."(果物)"; return $val; } ?> |
実行結果
array_map()で多次元連想配列を元に新たな配列を作成しています。
そのため、それぞれの値の後ろに「(果物)」がついた多次元の連想配列が表示されています。
他の配列を使用してarray_map()で新たな配列を作成する場合
他の配列を使用してarray_map()で新たな配列を作成する場合は、3つ目以降の引数に「他の配列」を指定します。
他の配列を指定すると、array_map()のコールバック関数内で使用することができるようになります。
また、他の配列は単数だけなく、複数指定することもできます。
他の配列を1つ指定する場合
他の配列を1つ指定してarray_map()を使用します。
● index.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 | <?php print_r("● 対象の多次元連想配列"); $colorArray = array( "fruit" => array( "red" => "リンゴ", "orange" => "オレンジ" ), "character" => array( "red" => "マリオ", "green" => "ルイージ" ) ); print_r($colorArray); print_r("● array_map()使用後"); $keyArray = array_keys($colorArray); $result = array_map("changePre", $colorArray, $keyArray); print_r($result); function changePre($array, $key) { if($key == "fruit") { $resu = array_map("add1", $array); return $resu; } if($key == "character") { $resu = array_map("add2", $array); return $resu; } } function add1($val) { $val = $val."(果物)"; return $val; } function add2($preName) { $kenName = $preName."(スーパーマリオ)"; return $kenName; } ?> |
実行結果
array_map()で他の配列を一つ指定して新たな配列を作成しています。
そのため、「fruit」のキー内にある連想配列の値に「(果物)」が挿入されて表示されています。
また、「character」のキー内にある連想配列の値には「(スーパーマリオ)」が挿入されて表示されています。
他の配列を2つ以上指定する場合
他の配列を2つ以上指定してarray_map()を使用します。
● index.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | <?php print_r("● 対象の配列"); $numbers = array(1, 2, 3, 4, 5); print_r($numbers); print_r("● array_map()使用後"); $numArr1 = array(2,2,2); $numArr2 = array("one" => 200, "two" => 150, "three" => 3100); $doubled_numbers = array_map('changeNum', $numbers, $numArr1, $numArr2); print_r($doubled_numbers); function changeNum($value, $arr1, $arr2) { if($arr2 >= 250) { $multiplier = 10; } else { $multiplier = $value + $arr1; } return $value * $multiplier; } ?> |
実行結果
array_map()で他の配列を2つ以上指定して新たな配列を作成しています。
そのため、「1,2,3,4,5」の配列から「3,8,30,16,25」の配列が作成されて表示されています。
array_map()を使用した実際のケース
array_map()を使用した実際のケースについてご紹介します。
ここでは、array_map()を使用してWordPressでカテゴリー名とそ記事数が表示されたボタンを作成します。
*修正箇所はテーマファイルによって異なるが、今回は「index.php」としています。
● index.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 | if(!is_front_page()) { $args = array( 'type' => 'post', 'child_of' => 0, 'parent' => '親カテゴリーのid', 'orderby' => 'name', 'order' => 'ASC', 'hide_empty' => 1, 'hierarchical' => 1 ); $categories = get_categories($args); $catIdArr = []; $catURLArr = []; $catArr = []; foreach ($categories as $category) { $catId = $category->cat_ID; array_push($catIdArr, $catId); $link = get_category_link($catId); array_push($catURLArr, $link); $catArr = array_combine($catURLArr, $catIdArr); } $catNmPgCnt = array_map(function($catId) { $this_cat = get_category($catId); $this_cat_name = $this_cat->name; $cat_count = get_category($catId)->count; $value = $this_cat_name.":".$cat_count."件"; return $value; }, $catArr); } foreach ($catNmPgCnt as $tagURL => $tagName) { echo "<div class= 'catName'><a href= '".$tagURL."'>".$tagName."</a></div>"; } |
● style.css
1 2 3 4 5 6 7 8 9 10 | .fxcatName { display: flex; } .catName { width: 25%; border: 2px solid #1934bb; margin: 10px; text-align: center; font-size: 20px; } |
実行結果
array_map()でカテゴリーページに自分が設定したカテゴリー名とそのカテゴリーに属している記事数がボタンとなって作成されています。
そのため、ボタンを押すことでそのカテゴリーページが表示され、そのカテゴリーに属している記事が表示されています。
配列や連想配列を上書きして新しい配列を作成する場合
配列や連想配列を上書きして新しい配列を作成する場合は、array_walk()を使用します。
array_walk()とは、array_map()と同じく新しい配列を作成するメソッドになります。
しかし、元の配列や連想配列を上書きしてしまうため、破壊的メソッドと呼ばれています。
● index.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | <?php print_r("● 対象の配列"); $arr = array(1, 2, 3, 4, 5); print_r($arr); print_r("● array_walk()使用後"); array_walk($arr, "plusTwo"); print_r($arr); function plusTwo(&$value1) { $value1 = (int)$value1 + 2; } ?> <?php print_r("● 対象の連想配列"); $fruits = array("red" => "リンゴ", "yellow" => "バナナ", "orange" => "オレンジ"); print_r($fruits); print_r("● array_walk()使用後"); array_walk($fruits , "addText"); print_r($fruits); function addText(&$value2) { $value2 = $value2."(果物)"; } ?> |
実行結果
array_walk()によって配列や連想配列を上書きして新しい配列を作成しています。
そのため、指定した配列や連想配列が更新されて表示されています。
配列や連想配列の要素数ごとに繰り返し処理を行う場合
配列や連想配列の要素数ごとに繰り返し処理を行う場合は、foreachを使用します。
foreachとはイテレータに対して繰り返し処理を行う文法になります。
そのため、配列は作成できませんが、それぞれの要素に対して処理を行うことはできます。
● index.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | <?php print_r("● 対象の配列"); $nums = array(10, 20, 30, 40, 50); print_r($nums); print_r("● foreach文使用後-1"); foreach ($nums as $num) { print_r($num); } ?> <?php print_r("● 対象の連想配列"); $fruits = array("red" => "リンゴ", "yellow" => "バナナ", "orange" => "オレンジ"); print_r($fruits); print_r("● foreach文使用後-2"); foreach ($fruits as $fruit) { print_r($fruit); } foreach (array_keys($fruits) as $fruitKey) { print_r($fruitKey); } ?> |
実行結果
foreach文によって指定した配列や連想配列に対して繰り返し処理が行われています。
そのため、配列の値がそれぞれ画面に表示されています。
また、連想配列の場合もキーと値がそれぞれ画面に表示されています。
もし、foreach文について詳しく知りたい場合は下記の記事をご参考ください。
まとめ
⚫︎ array_map()とは指定したイテレータ元に新たなイテレータを作成することができる関数である
⚫︎ array_map()を使用するには下記の引数を指定する
・コールバック関数(必須)
・対象の配列(必須)
・他の配列(任意)
⚫︎ 配列に要素が存在する場合にarray_map()を使用すると、元の配列をベースに新たな配列が作成される
⚫︎ 配列に要素が存在しない場合にarray_map()を使用すると、空の配列が返される
⚫︎ 連想配列の値を元に新しい配列を作成する場合は、array_map()を連想配列に対してそのまま使用する
⚫︎ 連想配列のキーを元に新しい配列を作成する場合は、araay_keys()で取得したキーの配列に対してarray_map()を使用する
⚫︎ array_map()は1次元だけでな、2次元や3次元のように多次元の配列や連想配列にも使用することができる
(作成される配列や連想配列も多次元)
⚫︎ array_map()の引数に他の配列をしていすることで、他の配列を材料にした上で新しい配列を作成することができる
(他の配列は単数、複数どちらでも指定することが可能)
⚫︎ 配列や連想配列を上書きして新しい配列を作成する場合は、array_walk()を使用する
⚫︎ 配列や連想配列の要素数ごとに繰り返し処理を行う場合は、foreach文を使用する