0

電子メールアドレスという1つのパラメーターに基づいて、多次元配列から一部のユーザーを抽出できるように、配列を並べ替えたいと思います。最終的には、元の配列を2つの異なる配列として分離したいと思います。1つは選択された電子メールアドレス($js以下のラベル)を持ち、もう1つはそうでない($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

あなたはこれについて間違った方法で進んでいると思います。 値がフィルタリングされたセットに存在するかどうかを決定するブール値を返す callable を 2 番目の引数として取る呼び出しarray_filterのようなものです。関数array_mapへの引数は、配列の各ユーザー要素を 1 つずつ指定します。sort_jerry_and_sue$users

ユーザーが定義済みの電子メール アドレスの 1 つを持っている場合に false を返すことにより、基本的に結果の配列からそれらをファイリングします。

ブール値でフィルター処理されたセットを 1 セット取得したら、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 に答える