【问题标题】:PHP - Array unique only using specific valuesPHP - 仅使用特定值的数组唯一
【发布时间】:2018-02-18 17:38:38
【问题描述】:

我有一个看起来像这样的 PHP 数组...

Array
(
    [0] => Array
    (
        [id] => 1
        [value] => 111
        [date] => 'today'
    )

[1] => Array
    (
        [id] => 2
        [value] => 222
        [date] => 'today'
    )

[2] => Array
    (
        [id] => 3
        [value] => 333
        [date] => 'today'
    )

[3] => Array
    (
        [id] => 1
        [value] => 111
        [date] => 'today'
    )

[4] => Array
    (
        [id] => 5
        [value] => 111
        [date] => 'today'
    )

)

如果我像这样使用 array_unique...

print_r(array_unique($array, SORT_REGULAR));

它删除了正确的重复 [3],但我正在寻找一种忽略 [id] 并且仅匹配 [date] 和 [value] 的方法,以便我的输出看起来像这样......

Array
(
    [0] => Array
    (
        [id] => 1
        [value] => 111
        [date] => 'today'
    )

[1] => Array
    (
        [id] => 2
        [value] => 222
        [date] => 'today'
    )

[2] => Array
    (
        [id] => 3
        [value] => 333
        [date] => 'today'
    )

)

【问题讨论】:

标签: php arrays multidimensional-array array-unique


【解决方案1】:

array_reduce + array_values() 解决方案:

$arr = [
    ['id' => 1, 'value' => 111, 'date'=> 'today'],
    ['id' => 2, 'value' => 222, 'date'=> 'today'],
    ['id' => 3, 'value' => 333, 'date'=> 'today'],
    ['id' => 1, 'value' => 111, 'date'=> 'today'],
    ['id' => 5, 'value' => 111, 'date'=> 'today']
    ];

$result = array_values(
    array_reduce($arr, function($r, $a){
        if (!isset($r[$a['value'] . $a['date']])) $r[$a['value'] . $a['date']] = $a;
        return $r;
    }, [])
);

print_r($result);

输出:

Array
(
    [0] => Array
        (
            [id] => 1
            [value] => 111
            [date] => today
        )

    [1] => Array
        (
            [id] => 2
            [value] => 222
            [date] => today
        )

    [2] => Array
        (
            [id] => 3
            [value] => 333
            [date] => today
        )
)

【讨论】:

    【解决方案2】:

    遍历您的数组并获得一个键作为'date''value' 字段的串联。如果已找到此键 - 跳过数组值:

    $pairs = [];
    $new_values = [];
    foreach ($array as $item) {
        $key = $item['date'] . $item['value'];
    
        if (empty($pairs[$key])) {
            $pairs[$key] = 1;
            $new_values[] = $item;
        }
    }
    

    【讨论】:

    • 您的解决方案在速度或资源方面与 RomanPerekhrests 版本是否有所不同?
    • 你可以自己比较一下。但我认为你不会发现显着差异。除非您的数组有数百万条记录,否则您甚至不会感觉到差异。
    猜你喜欢
    • 1970-01-01
    • 2018-04-11
    • 2022-01-24
    • 1970-01-01
    • 1970-01-01
    • 2013-04-19
    • 2012-11-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多