PHP 配列をオブジェクトっぽく扱うクラスを書いてみた
Larabelに配列をオブジェクトっぽく扱うクラスがあるという話を聞き、それを見てしまう前に自分の出せるものを出そうと思って書いてみた。 とりあえず現在やっている業務で必要となる形のものだけ。今後機能は増える。
- 文字列にしか使えない関数を再帰的に実行
- $obj->keyの書き方で値を取得できる
- $obj->key = $val;の書き方で値を設定できる
- メソッドチェーン(個人的には好みではないコピペしにくくなる)
テスト
<?php require dirname(__FILE__) . '/../ORE_Require.php'; $array = array( 'hankaku' => 'ハンカクカタカナABC123', 'lowercase' => 'abcdefg', 'recursive' => array( 'trim' => ' trim ', 'hoge1' => 'abcハンカクヘンカン', 'hoge2' => 'edfハンカクヘンカン', ), ); echo 'before ='.print_r($array, true)."\n"; $obj_arr = new ORE_Array($array); $array = $obj_arr ->array_map('trim') ->strtoupper() ->mb_convert_kana('CKVas') ->get_array(); echo 'after ='.print_r($array, true)."\n"; // キー値アクセス echo '$obj_arr->hankaku='.$obj_arr->hankaku."\n"; echo '$obj_arr->lowercase='.$obj_arr->lowercase."\n"; // str_replace $obj_arr->str_replace('ハンカクヘンカン', '全角になりました', true); $array = $obj_arr->get_array(); echo 'str_replace ='.print_r($array, true)."\n";
結果
よきよき
そのうち
- DBのテーブルのカラム名と同じkeyのみの配列を返すフィルタリング機能
- ソート機能
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 秒