插件窝 干货文章 PHP数组去重可以用闭包实现吗

PHP数组去重可以用闭包实现吗

闭包 array 数组 函数 542    来源:    2025-03-16

在PHP中,数组去重通常可以使用array_unique()函数来实现。然而,如果你想使用闭包(匿名函数)来实现数组去重,也是可以的。你可以结合array_filter()array_reduce()等函数来实现这个功能。

使用array_reduce()和闭包实现数组去重

<?php
$array = [1, 2, 2, 3, 4, 4, 5];

$uniqueArray = array_reduce($array, function($carry, $item) {
    if (!in_array($item, $carry)) {
        $carry[] = $item;
    }
    return $carry;
}, []);

print_r($uniqueArray);
?>

解释:

  • array_reduce() 函数将数组中的每个元素传递给闭包函数进行处理。
  • $carry 是累加器,初始值为空数组 []
  • $item 是当前处理的数组元素。
  • 在闭包函数中,我们检查 $item 是否已经存在于 $carry 中。如果不存在,则将其添加到 $carry 中。
  • 最终,$carry 将包含去重后的数组。

输出:

Array
(
    [0] => 1
    [1] => 2
    [2] => 3
    [3] => 4
    [4] => 5
)

使用array_filter()和闭包实现数组去重

<?php
$array = [1, 2, 2, 3, 4, 4, 5];

$seen = [];
$uniqueArray = array_filter($array, function($item) use (&$seen) {
    if (!in_array($item, $seen)) {
        $seen[] = $item;
        return true;
    }
    return false;
});

print_r($uniqueArray);
?>

解释:

  • array_filter() 函数会遍历数组中的每个元素,并将元素传递给闭包函数。
  • 闭包函数返回 truefalse 来决定是否保留该元素。
  • $seen 数组用于记录已经出现过的元素。
  • 如果元素不在 $seen 中,则将其添加到 $seen 中并返回 true,否则返回 false

输出:

Array
(
    [0] => 1
    [1] => 2
    [3] => 3
    [4] => 4
    [6] => 5
)

总结:

虽然PHP提供了array_unique()函数来直接去重,但使用闭包结合array_reduce()array_filter()也可以实现相同的功能。这种方法在某些特定场景下可能更有灵活性,尤其是当你需要在去重的同时进行其他操作时。