PHP, отфильтровать массив по похожему значению

у меня есть данный массив

array(1) {
  ["item_id"]=>
  string(21) "113-8583167-1223425-1"
}
array(1) {
  ["item_id"]=>
  string(19) "113-8583167-1223425"
}
array(1) {
  ["item_id"]=>
  string(21) "113-8583167-1223425-2"
}
array(1) {
  ["item_id"]=>
  string(19) "113-8701012-8931406"
}
array(1) {
  ["item_id"]=>
  string(21) "113-1610353-3061845-1"
}
array(1) {
  ["item_id"]=>
  string(19) "114-4039674-6828204"
}
array(1) {
  ["item_id"]=>
  string(19) "114-3749919-4620238"
}

мне нужно отфильтровать массив по похожим элементам Похожими элементами являются

113-8583167-1223425
113-8583167-1223425-1
113-8583167-1223425-2

мне нужно оставить только 113-8583167-1223425-2 значение

Как это можно реализовать? Какой лучше алгоритм для этого использовать


Ответы (2 шт):

Автор решения: UKRman

Ну можно таким способом, если начальный формат отвечает маске xxx-xxxxxxxx-xxxxxxxx, а там если что то только маску поправить:

$array = [
    ['item_id' => '113-8583167-1223425-1'],
    ['item_id' => '113-8583167-1223425'],
    ['item_id' => '113-8583167-1223425-2'],
    ['item_id' => '113-8701012-8931406'],
    ['item_id' => '113-8701012-8931406-1'],
    ['item_id' => '113-1610353-3061845-1'],
    ['item_id' => '113-1610353-3061845-25'],
    ['item_id' => '113-1610353-3061845-7'],
    ['item_id' => '113-1610353-3061845-5'],
    ['item_id' => '113-1610353-3061845-9'],
];

$array = array_unique(array_column($array, 'item_id'));

rsort($array, SORT_NATURAL);

$uniques[] = array_shift($array);
foreach ($array as $item) {
    $search = $item;
    if (0 !== preg_match('/(\d+\-\d+\-\d+)\-\d+/', $item, $match)) {
        list($original, $search) = $match;
    }

    $isUnique = true;
    foreach ($uniques as $unique) {
        if (strpos($unique, $search) !== false) {
            $isUnique = false;

            break;
        }
    }

    if (true === $isUnique) {
        $uniques[] = $item;
    }
}

$map = array_map(
    function ($value) {
        return ['item_id' => $value];
    },
    $uniques
);

var_dump($map);

Масив на выходе: введите сюда описание изображения

→ Ссылка
Автор решения: Denys Maksiura

Вот мой рабочий вариант

 $arrayItems = array();

        $array = [
            ['item_id' => '113-8583167-1223425-1'],
            ['item_id' => '113-8583167-1223425'],
            ['item_id' => '113-8583167-1223425-2'],
            ['item_id' => '113-8701012-8931406'],
            ['item_id' => '113-8701012-8931406-1'],
            ['item_id' => '113-1610353-3061845-1'],
            ['item_id' => '113-1610353-3061845-25'],
            ['item_id' => '113-1610353-3061845-7'],
            ['item_id' => '113-1610353-3061845-5'],
            ['item_id' => '113-1610353-3061845-9'],
            ['item_id' => '114-4039674-6828204'],
            ['item_id' => '114-3749919-4620238'],
            ['item_id' => '114-3749919-4620238-111'],
        ];
        $array = array_unique(array_column($array, 'item_id'));
        rsort($array);

        echo "<pre>";
        foreach($array as $data){
            $itemExplode = explode('-', $data);
            $item = $itemExplode[0] . '-' . $itemExplode[1] . '-' . $itemExplode[2];

            if($itemExplode[3] > $arrayItems[$item]) $arrayItems[$item] = $itemExplode[3];
            elseif (!array_key_exists($item, $arrayItems) AND is_null($itemExplode[3])) $arrayItems[$item] = $itemExplode[3];
        }

        var_dump($arrayItems);
→ Ссылка