如何基于单列对二维数组实现类似array_unique()的去重功能
用PHP内置函数给二维数组按指定列去重
先看你给出的输入数组:
[ ['foo' => 1, 'bar' => 2], ['foo' => 1, 'bar' => 3], ['foo' => 2, 'bar' => 4] ]
不用写循环,靠内置函数组合就能搞定按foo列去重,给你两种实用方法:
方法一:array_column + array_values 快速实现
array_column有个实用特性——第三个参数可以把指定列的值作为新数组的键。因为数组键不能重复,重复的键会自动覆盖,正好用来去重。之后用array_values把关联数组转成连续索引数组即可:
$original = [ ['foo' => 1, 'bar' => 2], ['foo' => 1, 'bar' => 3], ['foo' => 2, 'bar' => 4] ]; // 用foo的值当键,原数组元素当值,重复键直接覆盖 $uniqueArr = array_column($original, null, 'foo'); // 重置索引为连续数字 $uniqueArr = array_values($uniqueArr); print_r($uniqueArr);
输出会保留最后一个重复的foo=1项:
[ ['foo' => 1, 'bar' => 3], ['foo' => 2, 'bar' => 4] ]
要是想保留第一个重复项,先反转原数组,处理完再反转回来就行:
$uniqueArr = array_column(array_reverse($original), null, 'foo'); $uniqueArr = array_reverse(array_values($uniqueArr));
方法二:array_reduce 自定义控制
用array_reduce遍历数组,能自己灵活控制是否添加元素:
$uniqueArr = array_reduce($original, function($result, $item) { // 只有foo值没出现过才添加,保留第一个重复项 if (!isset($result[$item['foo']])) { $result[$item['foo']] = $item; } return $result; }, []); $uniqueArr = array_values($uniqueArr);
要是想保留最后一个重复项,去掉!isset判断即可,后面的元素会直接覆盖前面的。
内容的提问来源于stack exchange,提问作者Codemonkey
相关产品推荐
相关产品推荐

