PHP 配列再帰処理のarray_walk_recursiveとfilter_varの速度比較をしてみた
配列の再帰処理を見直すために速度を計測してみた。 array_walk_recursiveとfilter_varと自作再帰処理の3つ。 処理は全角空白と半角空白の削除で元の配列も残す方向。
<?php function get_array() { return array( 'zip' => ' 460 -0011 ', 'address' => array( ' 愛知県名古屋市 ', ' 中区大須 ', ' ハンカク ジュウショ ', ), ); } $funcA = function() { $array = get_array(); $new = $array; array_walk_recursive($new, function(&$val, $key) { $val = str_replace(array(' ', ' '), '', $val); }); // echo (__FILE__.':('.__LINE__.')'."\n".'$array='.print_r($array, true))."\n"; // echo (__FILE__.':('.__LINE__.')'."\n".'$new='.print_r($new, true))."\n"; }; $funcB = function() { $array = get_array(); $new = filter_var($array, FILTER_CALLBACK, ['options' => function ($val) { return str_replace(array(' ', ' '), '', $val); }]); // echo (__FILE__.':('.__LINE__.')'."\n".'$array='.print_r($array, true))."\n"; // echo (__FILE__.':('.__LINE__.')'."\n".'$new='.print_r($new, true))."\n"; }; $funcC = function() { $array = get_array(); $func = function(& $array) use( &$func){ foreach ($array as & $val) { $type = gettype($val); if ('array' === $type OR 'object' === $type) { $func($val); } else { $val = str_replace(array(' ', ' '), '', $val); } } }; $new = $array; $func($new); // echo (__FILE__.':('.__LINE__.')'."\n".'$array='.print_r($array, true))."\n"; // echo (__FILE__.':('.__LINE__.')'."\n".'$new='.print_r($new, true))."\n"; }; //$funcA(); //$funcB(); //$funcC(); //exit; $functions = array('A'=>$funcA, 'B'=>$funcB, 'C'=>$funcC); foreach ($functions as $key => $func) { $start = microtime(true); for ($i = 0; $i < 100000; $i++ ) { $func(); } $time = microtime(true) - $start; echo "{$key}: {$time} 秒\n"; }
実行結果
A:array_walk_recursive、B:filter_var、C:自作再帰処理
A: 0.17630290985107 秒 B: 0.1960391998291 秒 C: 0.24357509613037 秒