// 注意不要把键值设为0 原因如下
dump(0 == 'a'); // 返回 true
$arr = [
'a' => 1,
'b' => 1,
'' => 'a',
'c' => 'b',
'd' => 'a',
];
dump($arr);
// 仿 array_unique 函数
function array_unique2(array &$arr)
{
foreach ($arr as $k1 => $v1) {
if (!isset($arr[$k1])) continue;
foreach ($arr as $k2 => $v2) {
if ($k1 == $k2) continue;
if ($v1 == $v2) unset($arr[$k2]);
}
}
}
array_unique2($arr);
dump($arr);
结果如下:
进阶函数1
给数组去重 清除a,b值相等的数据
$arr = [];
for ($i = 0; $i < 5; ++$i) {
$arr[] = ['a' => mt_rand(0, 1), 'b' => mt_rand(0, 1)];
}
dump($arr);
function array_unique3(array &$arr)
{
foreach ($arr as $k1 => $v1) {
if (!isset($arr[$k1])) continue;
foreach ($arr as $k2 => $v2) {
if ($k1 == $k2) continue;
if ($v1['a'] == $v2['a'] && $v1['b'] == $v2['b']) unset($arr[$k2]);
}
}
}
array_unique3($arr);
dump($arr);
执行结果:
进阶函数2:
$arr = [];
for ($i = 0; $i < 5; ++$i) {
$arr[] = ['a' => mt_rand(0, 1), 'b' => mt_rand(0, 1)];
}
dump($arr);
// 进阶函数2
/**
* 给任意二维数组去重
* @param $arr array 需要去重的二维数组
* @param $args int/string 任意需要去重的键值,如果键值不存在,自动忽略
* @return array 返回二维数组(新)
*/
function array_unique4(array $arr, ...$args)
{
// 过滤没有的键值
foreach ($arr as $k1 => $v1) {
foreach ($args as $k2 => $v2) {
if (!isset($v1[$v2])) unset($args[$k2]);
}
}
if (empty($args)) return $arr; // 没有条件 返回原数组
foreach ($arr as $k1 => $v1) {
if (!isset($arr[$k1])) continue;
foreach ($arr as $k2 => $v2) {
if (!isset($arr[$k2]) || $k1 == $k2) continue;
$flag = TRUE;
foreach ($args as $k3 => $v3) {
if ($v1[$v3] != $v2[$v3]) {
$flag = FALSE;
break;
}
}
if ($flag) unset($arr[$k2]);
}
}
return $arr;
}
$arr = array_unique4($arr, 'a', 'b');
dump($arr);
执行结果: