【PHP】配列の値を部分一致検索する。

めも。

今回必要だったのは下記のようなシチュエーション。

配列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_」から始まる値のキーを取り除く事ができた。
ただし処理的にかなり重い部類に入ると思われるので、巨大な配列を処理する際は注意されたし。