Как преобразить структуру массива

294
04 апреля 2017, 13:13

Здравствуйте.

Как правильно написать алгоритм который преобразует массив одного вида в другой, только сгруппированный: грубо говоря, есть массив вытащенный из базы и отсортированный по названию такого вида 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%, но это совсем не решение, по этому решил пойти простым решением и с вашей помощью просто разгруппировать этот массив.

Буду очень признателен за правильную наводку.

Так же открыт к любым другим методам достижения цели.

Спасибо за внимание.

Answer 1

Разгруппировку по двум словам можно выполнить так:

$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" : "&emsp;$value";
        } else {
            print_m("<br>$space$key => [", $value, $level);
            echo "&emsp;]";
        }
    }
    $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)

А дальше определяться с другими ситуациями.

READ ALSO
Fatal error: Class &#39;ulangStream&#39; not found Umi cms

Fatal error: Class 'ulangStream' not found Umi cms

Добрый день! Вдруг появилась ошибка при попытке зайти в админку:

423
Как сгенерить токен в php?

Как сгенерить токен в php?

Пишу API для онлайн-игрыТребуется сгенерировать токен игрока из 30 знаков (только цифры и английские буквы)

443
Проблема с $_SERVER[&#39;REMOTE_ADDR&#39;]

Проблема с $_SERVER['REMOTE_ADDR']

Есть локальный сервер$_SERVER['REMOTE_ADDR'] почему-то дает результат "::1" вместо нормального "127

332