Удалить последовательный массив с повторяющимися значениями в многомерном массиве с помощью PHP - PullRequest
1 голос
/ 27 июня 2019

Я работаю над функцией, которая фильтрует многомерный массив, если последовательные массивы имеют одинаковое значение, мне нужно удалить промежуточные массивы и получить только первый и последний из последовательных массивов с дублирующимися значениями.

Я не могу понять, как это сделать.

Надеюсь, вы можете мне помочь.

Спасибо.

SAMPLE CODE

function removeDuplicates($array){
    $result = [];
    $count = 0;
    $firstValue = null;

    for ($i = 0; $i < count($array); $i++) {

        if($array[$i]['id'] == firstValue){

            $result[] = $array[$i]);

        }else{

            // do action

        }

    }

    return $array;

}

Пример массива

Array ( 
    [0] => Array ( 
        [key] => 0 
        [value] => 25 
        ) 
    [1] => Array ( 
        [key] => 1 
        [value] => 25 
        ) 
    [2] => Array ( 
        [key] => 2 
        [value] => 25 
        ) 
    [3] => Array ( 
        [key] => 3 
        [value] => 33 
        )    
    [4] => Array ( 
        [key] => 4 
        [value] => 45 
        ) 
    [5] => Array ( 
        [key] => 5 
        [value] => 66 
        ) 
    [6] => Array ( 
        [key] => 6 
        [value] => 66 
        ) 
    [7] => Array ( 
        [key] => 7 
        [value] => 66 
        ) 
    [8] => Array ( 
        [key] => 8 
        [value] => 66 
        ) 
    [9] => Array ( 
        [key] => 9 
        [value] => 55 
        ) 
    )

Здесь первые 3 массива имеют одинаковые значения (25), мне нужно удалить 2-й массив и сохранить 1-й и 3-й, также сС 6-го по 9-й сохраняются только 6-й и 9-й массивы.

Ожидаемый результат

Array ( 
    [0] => Array ( 
        [key] => 0 
        [value] => 25 
        )  
    [2] => Array ( 
        [key] => 2 
        [value] => 25 
        ) 
    [3] => Array ( 
        [key] => 3 
        [value] => 33 
        )    
    [4] => Array ( 
        [key] => 4 
        [value] => 45 
        ) 
    [5] => Array ( 
        [key] => 5 
        [value] => 66 
        ) 
    [8] => Array ( 
        [key] => 8 
        [value] => 66 
        ) 
    [9] => Array ( 
        [key] => 9 
        [value] => 55 
        ) 
    )

Ответы [ 4 ]

1 голос
/ 27 июня 2019

Вы можете подойти к этому как

$r = [];
$lastKey   = '';
foreach($array as $k => $v){ 
  if(in_array($v['value'], array_column($r, 'value'))){
    $lastKey = $v['key'];
  }else{
    if($lastKey && !in_array($lastKey, array_column($r, 'key'))){
        end($r);
        $r[] = [ 'key' => $lastKey, 'value' => $r[key($r)]['value']];
    }
    $r[]       = [ 'key' => $v['key'] , 'value' => $v['value'] ]; 
    $lastKey     = $v['key'];
  }
}

https://3v4l.org/f6FQv

1 голос
/ 27 июня 2019

Попробуйте это:

$array = [
        ["key" => 0, "value" => 25],
        ["key" => 1, "value" => 25],
        ["key" => 2, "value" => 25],
        ["key" => 3, "value" => 33],
        ["key" => 4, "value" => 45],
        ["key" => 5, "value" => 66],
        ["key" => 6, "value" => 66],
        ["key" => 7, "value" => 66],
        ["key" => 8, "value" => 66],
        ["key" => 9, "value" => 55],
];

for ($i = 0; $i < count($array); $i++) {
    if (!isset($array[$i])){
        continue;
    }
    if ($array[$i]['value'] == $array[$i+1]['value']) {
        $j = 1;
        while ($array[$i]['value'] == $array[$i+$j+1]['value']) {
            unset($array[$i+$j]);
            $j += 1;
        }
    }
}

print_r($array);

Поскольку вам необходимо сохранить ключи, цикл for выдаст уведомление, когда элемент не установлен.Вот почему мы сначала проверяем, существует ли элемент.

Затем цикл ищет два одинаковых значения, которые являются последовательными, то есть $i и $i+1.Как только он находит их, он входит в цикл while для проверки трех или более последовательных идентичных значений.Последовательный элемент будет сброшен только в том случае, если есть хотя бы одно вхождение до него и одно после него.Например, он будет удалять $i+2, только если $i+3 идентичен.

Надеюсь, это поможет!

0 голосов
/ 27 июня 2019

Пожалуйста, попробуйте, надеюсь, это работает

for ($i = 0; $i < count($array); $i++) {
    if ($array[$i]['value'] == $array[$i+1]['value']) {
        $j = 1;
        while ($array[$i]['value'] == $array[$i+$j+1]['value']) {
            echo $array[$i]['value'].'==='.$array[$i+$j+1]['value'];
            unset($array[$i+$j]);
            $j += 1;
        }
    }
}
0 голосов
/ 27 июня 2019

Вот решение: Ваш массив выглядит примерно так:

$array = [
            ["key" => 0, "value" => 25],
            ["key" => 1, "value" => 25],
            ["key" => 2, "value" => 25],
            ["key" => 3, "value" => 33],
            ["key" => 4, "value" => 45],
            ["key" => 5, "value" => 66],
            ["key" => 6, "value" => 66],
            ["key" => 7, "value" => 66],
            ["key" => 8, "value" => 66],
            ["key" => 9, "value" => 55],
        ];

сначала найдите первое и последнее вхождение каждого значения. Вам нужен метод, который перемещается по массиву и находит точное значение. Посмотрите на это:

function search($search, $array)
    {
        foreach ($array as $key => $val) {
            if ($val['value'] === $search) {
                return $key;
            }
        }

        return null;
    }

Запуск $firstOccurrence = search(25, $array) найдет первое вхождение 25.

Теперь, чтобы найти индекс последнего вхождения, мы должны обратить массив к перемещению от конца массива. Так что $lastOccurrence = search(25, array_reverse($array, true)) найдет последний индекс вхождения 25.

Хорошо, когда мы обрабатываем каждое значение, мы не должны его обрабатывать снова. Поэтому нам нужен массив, который будет содержать значения, которые обрабатываются.

Окончательный код:

function testArray()
    {
        $array = [
            ["key" => 0, "value" => 25],
            ["key" => 1, "value" => 25],
            ["key" => 2, "value" => 25],
            ["key" => 3, "value" => 33],
            ["key" => 4, "value" => 45],
            ["key" => 5, "value" => 66],
            ["key" => 6, "value" => 66],
            ["key" => 7, "value" => 66],
            ["key" => 8, "value" => 66],
            ["key" => 9, "value" => 55],
        ];
        $processedItems = [];
        $newArray = [];
        foreach ($array as $index => $item) {
            if (in_array($item["value"], $processedItems))
                continue;
            $processedItems[] = $item["value"];
            $firstIndex = search($item["value"], $array);
            $lastIndex = search($item["value"], array_reverse($array, true));
            $newArray[$firstIndex] = $array[$firstIndex];
            if ($firstIndex != $lastIndex)
                $newArray[$lastIndex] = $array[$lastIndex];
        }
        print_r($newArray);
    }

    function search($search, $array)
    {
        foreach ($array as $key => $val) {
            if ($val['value'] === $search) {
                return $key;
            }
        }

        return null;
    }
...