めも。
今回必要だったのは下記のようなシチュエーション。
配列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_」から始まる値のキーを取り除く事ができた。
ただし処理的にかなり重い部類に入ると思われるので、巨大な配列を処理する際は注意されたし。