我想对数组进行排序,以便我可以根据一个参数(即他们的电子邮件地址)从多维数组中提取一些用户。最后,我希望将原始数组分为2个不同的数组:一个选择了电子邮件地址(下面标有$js
),另一个没有(下面标有$not_js
)。
这是我的代码:
<?php
$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' );
function sort_jerry_and_sue($users)
{
$j_and_s=array('jj@jj.com', 'ss@ss.com');
$not_js=array();
foreach($j_and_s as $row=>$js){
if(in_array($js, $users)){
}
else {
array_push($not_js, $users);
}
}
return $not_js;
}
$not_js = array_filter($users, 'sort_jerry_and_sue');
print_r($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($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 ))
?>
目前打印$not_js
会返回所有4个用户,$js
不会打印任何显而易见的内容。任何想法都将不胜感激!
答案 0 :(得分:1)
我认为你这是错误的做法。 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);
?>
答案 1 :(得分:0)
尝试循环遍历users
数组而不是j_and_s
:
function sort_jerry_and_sue($users)
{
$j_and_s=array('jj@jj.com', 'ss@ss.com');
$not_js=array();
foreach($users as $js){
if(in_array($js['email'], $j_and_s)){
}
else {
array_push($not_js, $users);
}
}
return $not_js;
}