めも。
今回必要だったのは下記のようなシチュエーション。
配列1の各要素を配列2の要素すべてと部分一致するかを評価し、
真の場合その要素を配列中から取り除くといった処理を行いたい。
ようは親配列(配列1)から無視リスト(配列2)の要素を取り除きたかったのである。
class hoge extends fuga{ protected $return = array(); public function execute(){ // 何らかの配列 $array = array( 'foo_1', 'foo_2', 'foo_3', 'bar_1', 'bar_2', 'bar_3', ); // 配列にフィルターをかける array_walk_recursive($array, array('self', 'arrayLikeFilter')); $array = $this->return; var_dump($array); die(); } // 配列から取り除きたい値リストを返却する関数 protected function _getIgnore() { return array( 'foo_' ); } protected function arrayLikeFilter(&$value, $key) { $add = true; foreach($this->_getIgnore() as $file) { $p = "/$file/i"; if(preg_match($p, $value)) { $add = false; } } if($add) { $this->return[] = $value; } } }
上記クラスexecute()メソッドの実行結果は下記となる。
array(3) { [0]=> string(5) "bar_1" [1]=> string(5) "bar_2" [2]=> string(5) "bar_3" }
みごとにライク検索で「foo_」から始まる値のキーを取り除く事ができた。
ただし処理的にかなり重い部類に入ると思われるので、巨大な配列を処理する際は注意されたし。