检查数组中的下一个值,如果匹配,则删除下一个项目(PHP)

时间:2019-02-20 15:00:59

标签: php arrays

我正在尝试检查数组子项中的下一项是否仅匹配某些子项的值,然后删除找到的匹配项。

我最终将需要在删除之前添加代码,如果找到匹配项,它将收集子项目之间的差异,因此我不能简单地使用array_unique()。

以下内容在一定程度上有效;

 $n = 1;
 for ($i = 0; $i < count($array); $i++) {
    if($array[$i]['author'] == $array[$n]['author']
    && $array[$i]['parentID'] == $array[$n]['parentID']) {
        unset($array[$n]);
        //skip the removed item and continue;
        $i++;
        $n++;
    }
    $n++;
 }

但是,它仅删除一个实例,并保留所有符合以下条件的实例。 (下面删除了1个,但未删除2个)

[0] => Array
    (
        [parentID] => 85560
        [author] => Carla
        [revisions] => 1
    )
[2] => Array
    (
        [parentID] => 85560
        [author] => Carla
        [revisions] => 2
    )
[3] => Array
    (
        [parentID] => 85560
        [author] => Charlie
        [revisions] => 4
    )

这是初始输入;

[0] => Array
    (
        [parentID] => 85560
        [author] => Carla
        [revisions] => 1
    )
[1] => Array
    (
        [parentID] => 85560
        [author] => Carla
        [revisions] => 2
    )
[2] => Array
    (
        [parentID] => 85560
        [author] => Carla
        [revisions] => 2
    )
[3] => Array
    (
        [parentID] => 85560
        [author] => Charlie
        [revisions] => 4
    )

1 个答案:

答案 0 :(得分:2)

您可以使用array_filter

$unique = [];

$array = array_filter($array, function($value) use (&$unique) {
    $key = implode('', $value);

    if(!in_array($key, $unique)) {
        $unique[] = $key;
        return true;
    }

    return false;
});

var_dump($array);

或者,如果不需要保留初始索引,则可以使用array_reduce

$array = array_reduce($array, function ($carry, $item) {
    $key = implode('', $item);

    if (!isset($carry[$key])) {
        $carry[$key] = $item;
    }

    return $carry;
}, []);

var_dump(array_values($array));