【PHP】よく使うArray系関数[array_map,array_reduce,array_filter]

B!

配列の加工

これまでにforeachを使用して配列を任意の形に加工していた。

ところがどっこい、PHPには便利な関数が存在することを最近知った。

これまで配列から1つずつ要素を取り出し、所定の処理を実行していた自分が恥ずかしい…

array_map

配列の各要素に所定の処理を行う関数。(結構よく使うようになった。だって便利だもん)

ぼかぁ、CSVを読み込んだ後に文字コードの変換等を行うときに結構使用する。

array_map(コールバック関数, 配列)
$test =['ジョーダン', 'ジョンソン', 'ジャクソン'];

$testMap = array_map(function($t) {
    return 'マイケル' . $t;
}, $test);

var_dump($testMap);
array(3) {
[0]=>
string(27) "マイケルジョーダン"
[1]=>
string(27) "マイケルジョンソン"
[2]=>
string(27) "マイケルジャクソン"
}

 

連想配列を指定すると多次元配列として返ってくるのでそこだけは要注意。

$test =['ジョーダン', 'ジョンソン', 'ジャクソン']; 
$testMap = array_map(function($t) {
    return ["test" => 'マイケル' . $t]; 
}, $test);
var_dump($testMap);

array(3) {
  [0]=>
  array(1) {
    ["test"]=>
    string(27) "マイケルジョーダン"
  }
  [1]=>
  array(1) {
    ["test"]=>
    string(27) "マイケルジョンソン"
  }
  [2]=>
  array(1) {
    ["test"]=>
    string(27) "マイケルジャクソン"
  }
}

 

array_filter

名前の通りフィルタリングしてくれるっす。基本的にはarray_map()と一緒です。

ただし内部的にはempty()が実行されているようなので、配列から空を除去できるらしい。(いつ使うのか想像できないけれど、)

$test =['ジョーダン', '', 'ジャクソン'];

$testFilter = array_filter($test);

var_dump($testFilter);

array(2) {
  [0]=>
  string(15) "ジョーダン"
  [2]=>
  string(15) "ジャクソン"
}

array_reduce

配列の要素を1つの値に加工してくれる関数。

チェックボックス等で指定された検索条件(配列)をSQLの条件式に割り当てるときに使用できる。

今回は生SQLに無理やり割り当てているが、ORMの場合は結構使いやすい。

$test =['1', '2', '3']; 

$query = '1=1';
$testFilter = array_reduce($test,  function($carry,$item) {
	$carry = $carry . ' OR test_column = '. $item;
	return $carry;	
}, $query);

var_dump($testFilter);
string(60) "1=1 OR test_column = 1 OR test_column = 2 OR test_column = 3"

 

array_reduce()に渡している要素がなくなるまで、以下の処理が繰り返される。

  1. $testのインデックスが0の値を抽出し、クロージャの$itemに格納し処理をする。
  2. 1つの処理が終了すると$carryに値を保持する
  3. 最後に$carryを返却

ちなみにarray_reduce()の第三引数に一番最初に処理を実行する前の初期データ$queryを渡しているが、省略することができる。

<?php
$test =['1', '2', '3']; 

$testFilter = array_reduce($test,  function($carry,$item) {
	$carry = $carry . ' OR test_column = '. $item;
	return $carry;	
});

var_dump($testFilter);
string(57) " OR test_column = 1 OR test_column = 2 OR test_column = 3"
?>

 

 

 

最新の記事はこちらから