Я думаю, вы поступаете неправильно.array_filter
походит на array_map
вызов, который принимает в качестве второго аргумента вызываемый объект, который возвратит логическое значение, определяющее, существует ли значение в отфильтрованном наборе.Аргументом функции sort_jerry_and_sue
будет каждый пользовательский элемент массива $users
, один за другим.
Возвращая false, если у пользователя есть один из предопределенных адресов электронной почты, вы, по сути, подаете их изрезультирующий массив.
Как только у вас есть один набор булево отфильтрованного набора, вы получите комплимент, выполнив array_diff_assoc, чтобы получить разницу.
<?php
class EmailFilter {
private $emails = array();
public function __construct(array $emails) {
$this->emails = $emails;
}
public function filter_users($user) {
return in_array($user['email'], $this->emails);
}
}
$users['1'] = array('name'=>'bob barker', 'email'=>'bb@bb.com', 'id'=>'1');
$users['2'] = array('name'=>'jerry jones', 'email'=> 'jj@jj.com', 'id'=>'2' );
$users['3'] = array('name'=>'sue smith', 'email'=>'ss@ss.com', 'id'=>'3' );
$users['4'] = array('name'=>'zach zed', 'email'=>'zz@zz.com', 'id'=>'4' );
$filter_emails = array('jj@jj.com', 'ss@ss.com');
$not_js = array_filter($users, array(new EmailFilter($filter_emails), 'filter_users'));
$js = array_diff_assoc($users, $not_js);
// this is what i'd like it to print=> $not_js = Array ([0] => Array ( [name] => bob barker [email] => bb@bb.com [id] => 1 ) [1] => Array ( [name] => zach zed [email] => zz@zz.com [id] => 4 ))
print_r($not_js);
// this is what i'd like it to print=> $js = Array ([0] => Array ( [name] => jerry jones [email] => jj@jj.com [id] => 2 ) [1] => Array ( [name] => sue smith [email] => ss@ss.com [id] => 3 ))
print_r($js);
?>