найти / отсортировать несколько значений из многомерного массива с помощью PHP - PullRequest
0 голосов
/ 07 февраля 2012

Я бы хотел отсортировать массив так, чтобы я мог извлечь некоторых пользователей из многомерного массива на основе одного параметра - их адресов электронной почты. В конечном итоге я хотел бы разделить исходный массив на 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 ничего не печатает, так что, очевидно, это неправильно. Любые мысли будут с благодарностью!

Ответы [ 2 ]

1 голос
/ 07 февраля 2012

Я думаю, вы поступаете неправильно.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);
?>
0 голосов
/ 07 февраля 2012

Попробуйте выполнить цикл по массиву 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;
}
...