0

我想对一个数组进行排序,以便我可以根据一个参数(他们的电子邮件地址)从多维数组中提取一些用户。最终,我希望将原始数组分隔为 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不打印任何内容,所以显然这是不对的。任何想法将不胜感激!

4

2 回答 2

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);
?>
于 2012-02-07T04:07:20.370 回答
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;
}
于 2012-02-07T04:11:08.720 回答