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);
