过滤二维数组

4

我有一个类似于这样的数组

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

这样就一直持续下去了。

我在其他地方找到了这个问题(在这里)和(在这里),但都不起作用。

使用第一个方法,我得到了以下数组:

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

对于第二个,它只过滤掉完全重复的元素,而不是仅具有相同id的重复元素。

我想从数组中删除所有具有相同id的重复项,我该如何做?


2
你的结果预期只包含 joe 吗? - deceze
@deceze 不是 johnjoe - Liam de Haas
3个回答

5

使用PHP>=5.5.0版本非常简单:

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

可选:

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

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

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

事实上,我已经多次发布了这个答案的变体,但是我现在找不到它们... - 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.

Otherwise:

$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"
  }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接