Здравствуйте.
Как правильно написать алгоритм который преобразует массив одного вида в другой, только сгруппированный: грубо говоря, есть массив вытащенный из базы и отсортированный по названию такого вида https://pastebin.com/i1tbcGpe , моя цель вынести в отдельные массивы схожие между собой значения, т.е. из этого:
...
['title' => 'Aton 4 Black Sea'],
['title' => 'Aton 4 Coffee Bean'],
['title' => 'Aton 4 Grape Juice'],
['title' => 'Aton 4 True Blue'],
['title' => 'Aton Basic Blue Moon'],
['title' => 'Aton Basic Cobblestone'],
['title' => 'Aton Basic Pure Black'],
['title' => 'Aton Basic Purple Rain'],
['title' => 'Aton Basic Rumba Red'],
...
пытаюсь получить следующие:
[0] => [
['title' => 'Aton 4 Black Sea'],
['title' => 'Aton 4 Coffee Bean'],
['title' => 'Aton 4 Grape Juice'],
['title' => 'Aton 4 True Blue'],
],
[1] => [
['title' => 'Aton Basic Blue Moon'],
['title' => 'Aton Basic Cobblestone'],
['title' => 'Aton Basic Pure Black'],
['title' => 'Aton Basic Purple Rain'],
['title' => 'Aton Basic Rumba Red'],
];
Последние 2 дня провозился с вычислением сходства строк между собой посредством функций similar_text и levenshtein это помогло в некоторых случаях, процентов на 65%, но это совсем не решение, по этому решил пойти простым решением и с вашей помощью просто разгруппировать этот массив.
Буду очень признателен за правильную наводку.
Так же открыт к любым другим методам достижения цели.
Спасибо за внимание.
Разгруппировку по двум словам можно выполнить так:
$arr = [
['title' => 'Aton 4 Black Sea'],
['title' => 'Aton 4 Coffee Bean'],
['title' => 'Aton 4 Grape Juice'],
['title' => 'Aton 4 True Blue'],
['title' => 'Aton Basic Blue Moon'],
['title' => 'Aton Basic Cobblestone'],
['title' => 'Aton Basic Pure Black'],
['title' => 'Aton Basic Purple Rain'],
['title' => 'Aton Basic Rumba Red']
];
function print_m($text, $arr, $level=0){
$space = str_repeat(" ", $level++);
echo "$space<b>$text</b>";
$flag = false;
foreach($arr as $value) $flag = $flag || (gettype($value)=="array");
foreach($arr as $key => $value) {
if(gettype($value) != "array") {
echo $flag ? "<br>$key => $value" : " $value";
} else {
print_m("<br>$space$key => [", $value, $level);
echo " ]";
}
}
$level--;
}
$common = [];
print_m("arr:", $arr);
array_walk($arr, function($val)use(&$common){
$exval = explode(" ", end($val), 3);
$key2 = $exval[0]." ".$exval[1];
$common[$key2][] = $val;
});
print_m("<br>common:",$common);
$result = array_values($common);
print_m("<br>result = values:",$result);
var_dump($result);
Результаты работы программы:
arr:
0 => [ Aton 4 Black Sea ]
1 => [ Aton 4 Coffee Bean ]
2 => [ Aton 4 Grape Juice ]
3 => [ Aton 4 True Blue ]
4 => [ Aton Basic Blue Moon ]
5 => [ Aton Basic Cobblestone ]
6 => [ Aton Basic Pure Black ]
7 => [ Aton Basic Purple Rain ]
8 => [ Aton Basic Rumba Red ]
common:
Aton 4 => [
0 => [ Aton 4 Black Sea ]
1 => [ Aton 4 Coffee Bean ]
2 => [ Aton 4 Grape Juice ]
3 => [ Aton 4 True Blue ] ]
Aton Basic => [
0 => [ Aton Basic Blue Moon ]
1 => [ Aton Basic Cobblestone ]
2 => [ Aton Basic Pure Black ]
3 => [ Aton Basic Purple Rain ]
4 => [ Aton Basic Rumba Red ] ]
result = values:
0 => [
0 => [ Aton 4 Black Sea ]
1 => [ Aton 4 Coffee Bean ]
2 => [ Aton 4 Grape Juice ]
3 => [ Aton 4 True Blue ] ]
1 => [
0 => [ Aton Basic Blue Moon ]
1 => [ Aton Basic Cobblestone ]
2 => [ Aton Basic Pure Black ]
3 => [ Aton Basic Purple Rain ]
4 => [ Aton Basic Rumba Red ] ]
C:\wamp64\www\2017\17_04_03_explode_walk\index.php:43:
array (size=2)
0 =>
array (size=4)
0 =>
array (size=1)
'title' => string 'Aton 4 Black Sea' (length=16)
1 =>
array (size=1)
'title' => string 'Aton 4 Coffee Bean' (length=18)
2 =>
array (size=1)
'title' => string 'Aton 4 Grape Juice' (length=18)
3 =>
array (size=1)
'title' => string 'Aton 4 True Blue' (length=16)
1 =>
array (size=5)
0 =>
array (size=1)
'title' => string 'Aton Basic Blue Moon' (length=20)
1 =>
array (size=1)
'title' => string 'Aton Basic Cobblestone' (length=22)
2 =>
array (size=1)
'title' => string 'Aton Basic Pure Black' (length=21)
3 =>
array (size=1)
'title' => string 'Aton Basic Purple Rain' (length=22)
4 =>
array (size=1)
'title' => string 'Aton Basic Rumba Red' (length=20)
А дальше определяться с другими ситуациями.
Современные инструменты для криптотрейдинга: как технологии помогают принимать решения
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости