Можно попробовать поплясать с функцией
similar_text
Если в первом массиве всегда в скобках пишутся значения, которые содержатся во втором массиве - то есть смысл из первого массива сравнивать только то что в скобках.
Алгоритм примерно такой:
$fullNames = [
'Кровать 2-х ярусная (Венге-Дуб Выбеленный)',
'Полка "ПН-1" (Венге)',
'Полка "ПН-4" (Венге светлый)'
];
$shortNames = [
"Венге",
"Венге+дуб выбеленный",
"Венге светлый"
];
function getTextBeetwenBraces($text) {
$firstBracePos = strrpos($text, '(');
$lastBracePos = strrpos($text, ')');
$betweenBraces = substr($text, $firstBracePos + 1, $lastBracePos - $firstBracePos - 1);
return $betweenBraces;
}
usort($fullNames, function($a, $b) {
return strlen(getTextBeetwenBraces($b)) - strlen(getTextBeetwenBraces($a));
});
usort($shortNames, function($a, $b) {
return strlen($b) - strlen($a);
});
$result = [];
for ($i = 0, $j = count($fullNames); $i < $j; ++$i) {
$ranks = [];
for ($l = $i, $k = count($shortNames); $l < $k; ++$l) {
$ranks[similar_text($fullNames[$i], $shortNames[$l])] = $l;
}
ksort($ranks);
$result[$shortNames[end($ranks)]] = $fullNames[$i];
}
var_dump($result);
Результат:
array(3) {
["Венге+дуб выбеленный"]=>
string(75) "Кровать 2-х ярусная (Венге-Дуб Выбеленный)"
["Венге светлый"]=>
string(47) "Полка "ПН-4" (Венге светлый)"
["Венге"]=>
string(32) "Полка "ПН-1" (Венге)"
}
Это всего-лишь примерный код, его можно совершенствовать под конкретные случаи. Но мне кажется это работает)