2015-06-19 2 views
4

У меня есть массив, который выглядит немного как этотфильтр 2 одномерный массив

array(
    [0] => array(
     ['id'] => 29 
     ['name'] => john 
     ) 
    [1] => array(
     ['id'] => 30 
     ['name'] => joe 
     ) 
    [2] => array(
     ['id'] => 29 
     ['name'] => jake 
     ) 
) 

И что продолжается некоторое время.

Я нашел вопрос в другом месте (here) и (here) Но не работает.

С первым я получаю следующий массив

array(
    [0] => 29 
    [1] => jake 
) 

И тэ второй это только фильтрует точные дубликаты и не дубликаты Jus то же id.

Я хочу, чтобы все дубликаты с тем же id удалены из массива, как это сделать?

+2

Итак, ваш результат должен содержать только 'joe'? – deceze

+0

@deceze no, 'john' и' joe'. –

ответ

4
$filteredUsers = []; 
foreach ($users as $user) { 
    $filteredUsers[$user['id']] = $user; 
} 

// optionally: 
// $filteredUsers = array_values($filteredUsers); 
+0

Я уже много раз публиковал вариации этого ответа, но на данный момент я не могу найти ни одного из них ... – deceze

2

Если вы хотите удалить дубликаты и оставить один в покое:

$array = array(
    array(
     'id' => 29, 
     'name' => 'john' 
    ), 
    array(
     'id' => 30, 
     'name' => 'joe' 
    ), 
    array(
     'id' => 29, 
     'name' => 'jake' 
    ) 
); 

$filter = []; 
$array = array_filter($array, function($a) use (&$filter) { 
    $ret = !isset($filter[$a['id']]); 
    $filter[$a['id']] = true; 

    return $ret; 
}); 

Demo.

В противном случае:

$duplicate = array_count_values(array_map(function($i) { 
    return $i['id']; 
}, $array)); 

$array = array_filter($array, function($a) use ($duplicate) { 
    return $duplicate[$a['id']] <= 1; 
}); 

var_dump($array); 

Это будет печатать:

array(1) { 
    [1]=> 
    array(2) { 
    ["id"]=> 
    int(30) 
    ["name"]=> 
    string(3) "joe" 
    } 
} 
5

Простой с PHP> = 5.5.0:

$result = array_column($array, null, 'id'); 

Факультативно:

$result = array_values(array_column($array, null, 'id')); 
+2

Это потрясающе! +1 – Federkun

Смежные вопросы