array_functionsより通常のループの方がパフォーマンスが良いそうです。
http://www.levijackson.net/are-array_-functions-faster-than-loops/
https://stackoverflow.com/questions/18144782/performance-of-foreach-array-map-with-lambda-and-array-map-with-static-function#answer-26527704
foreach例
$string = " , , あ, い, う\t\n\r,え,お か,き く,け";
$list = explode(',', $string);
$new_list = [];
foreach ($list as $value)
{
$value = mb_ereg_replace('^[\s ]+|[\s ]+$', '', $value);
if ($value !== "")
{
$new_list[] = $value;
}
}
var_dump($new_list);
array(7) {
[0]=>
string(3) "あ"
[1]=>
string(3) "い"
[2]=>
string(3) "う"
[3]=>
string(3) "え"
[4]=>
string(7) "お か"
[5]=>
string(9) "き く"
[6]=>
string(3) "け"
}
array_functions例
(foreachに比べて回す回数が多いので良くないのかも?)
$string = " , , あ, い, う\t\n\r,え,お か,き く,け";
$list = explode(',', $string);
$list = array_map(function ($value) {
return mb_ereg_replace('^[\s ]+|[\s ]+$', '', $value);
}, $list);
$list = array_filter($list, function ($value) {
return $value !== "";
});
$list = array_merge($list);
var_dump($list);
array(7) {
[0]=>
string(3) "あ"
[1]=>
string(3) "い"
[2]=>
string(3) "う"
[3]=>
string(3) "え"
[4]=>
string(7) "お か"
[5]=>
string(9) "き く"
[6]=>
string(3) "け"
}
自分でもパフォーマンスが気になったので試してみました。
パフォーマンス確認
ここで確認
array_functions系
$start = microtime(true);
foreach(range(0, $loop_count) as $value)
{
$string = " , , あ, い, う\t\n\r,え,お か,き く,け";
$list = explode(',', $string);
$list = array_map(function ($value) {
return mb_ereg_replace('^[\s ]+|[\s ]+$', '', $value);
}, $list);
$list = array_filter($list, function ($value) {
return $value !== "";
});
$list = array_merge($list);
}
$end = microtime(true);
var_dump(sprintf('%f', $end - $start));
array_functions系3回を1セットで10000ループ
0.2~0.3秒程度
array_functions系3回を1セットを1ループ
0.000090~0.000200秒程度
foreach
$start = microtime(true);
foreach(range(0, $loop_count) as $value)
{
$string = " , , あ, い, う\t\n\r,え,お か,き く,け";
$list = explode(',', $string);
$new_list = [];
foreach ($list as $value)
{
$value = mb_ereg_replace('^[\s ]+|[\s ]+$', '', $value);
if ($value !== "")
{
$new_list[] = $value;
}
}
}
$end = microtime(true);
var_dump(sprintf('%f', $end - $start));
foreach1回を1セットで10000ループ
0.14~0.25秒程度
foreach1回を1セットで1ループ
0.000074~0.000170秒程度
結果
array_functionsを数パターン駆使して実装したものとforeachで一括で実装したものを
10000週程すると差が出てきたのははっきりとわかりました。
何週も回す処理でない限りパフォーマンスの差は殆ど出ないので1回だけの普通の処理を実装するなら見やすいほうだったりと好きな方で良いかなと思います。
しかし、実際に業務で使うようなCSV(パースはCSV用の関数を使ってください)は件数も多い(ループが多い)と思いますのでforeachでまとめて処理といった感じになるとおもいます。