如何从PHP多维数组中删除重复项,不区分大小写但保留大小写?

4

在PHP中,有很多解决从多维数组中删除重复项的方法,但我还没有找到一个可以检测重复项(无论大小写)并保留它们在输出中的方法。

// Sample data
$arr  = [
    ['id' => 1, 'term' => 'Hello'],
    ['id' => 1, 'term' => 'hello'],
    ['id' => 2, 'term' => 'Hello'],
    ['id' => 2, 'term' => 'hello']
];

// Desired output
$arr  = [
    ['id' => 1, 'term' => 'Hello'],
    ['id' => 2, 'term' => 'Hello']
];

// Ex 1. case sensitive, preserves case
$serialized = array_map('serialize', $arr);
$unique = array_unique($serialized);
$unique = array_intersect_key($arr, $unique);

// Ex 2. case insensitive, doesn't preserve case
$unique = array_map('unserialize',
    array_unique(
        array_map('strtolower',
            array_map('serialize',$arr)
        )
    )
);

1
你对当前输入数组的期望输出是什么? - Rahul
2个回答

3
与其修改数组的内容,这会为数组创建一个键(以与操作主数组类似的方式),然后使用 array_combine() 将键与数据组合在一起,从而移除重复项(因为结果中只能存在一个键)。
$arr  = [
    ['id' => 1, 'term' => 'Hello'],
    ['id' => 1, 'term' => 'hello'],
    ['id' => 1, 'term' => 'Hello'],
    ['id' => 2, 'term' => 'Hello']
];

$key = array_map("serialize", $arr);
$key = array_map("strtolower", $key);
$new = array_combine($key, $arr);

print_r(array_values($new));

gives...

Array
(
    [0] => Array
        (
            [id] => 1
            [term] => Hello
        )

    [1] => Array
        (
            [id] => 2
            [term] => Hello
        )

)

对于身材矮小的人,它可以被包裹为 1 行(尽管不太易读)...

$new = array_values(array_combine(array_map("strtolower", array_map("serialize", $arr)), $arr));

0

没有内置的方法。但是,您可以定义一个自定义比较器和排序:

function compare($a, $b) {
     ksort($a);
     ksort($b); //To ignore keys not in the same order
     return strtolower(serialize($a)) <=> strtolower(serialize($b));
}

function array_unique_callback($arr, $callback) {
    $copy = $arr;
    usort($copy, $callback);
    $previous = null;
    $arr = [];
    foreach ($copy as $key => $value) {
        if ($previous === null || $callback($previous,$value) !== 0) {
            $previous = $value;
            $arr[$key] = $value;
        }
    }
    return $arr;
}

// Sample data
$arr  = [
    ['id' => 1, 'term' => 'Hello'],
    ['id' => 2, 'term' => 'hello'],
    ['id' => 1, 'term' => 'hello'],
    ['id' => 2, 'term' => 'Hello']
];

print_r(array_unique_callback($arr, 'compare'));

请注意,这对于多维子数组将不起作用,除非它们的键以相同的顺序排列。您可能需要进行递归ksort才能使其正常工作。 < p > {{link1:工作示例}} < / p >

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