Ассоциативная сортировка массива

#php #arrays #sorting

#php #массивы #сортировка

Вопрос:

У меня есть массив, подобный приведенному ниже. Мне нужно отсортировать массив по большинству совпадающих тегов.

 [0] =>[ 
     [id]=>1,
     [tags]=>Apple,Banana,Mango
    ],
[1] =>[ 
     [id]=>2,
     [tags]=>Apple,Mango,Banana,Orange
    ],
[2] =>[ 
     [id]=>3,
     [tags]=>Mango,Orange
    ],,
[3] =>[ 
     [id]=>4,
     [tags]=>Blackberry,Orange
    ],
[4] =>[ 
     [id]=>5,
     [tags]=>Orange,Blackberry,Banana
    ]
  

У меня есть строка тегов для сортировки массива.

 $tags_str = "Mango,Banana,Orange".  // dynamic string (no. of tags not fix)
  

Массив должен быть отсортирован в порядке убывания совпадающих тегов.

Ожидаемый результат:

 [0] =>[ 
      [id]=>2,
      [tags]=>Apple,Mango,Banana,Orange   // 3 tags matched
     ],
[1] =>[ 
     [id]=>1,
     [tags]=>Apple,Banana,Mango          // 2 tags matched
    ],
[2] =>[ 
     [id]=>3,
     [tags]=>Mango,Orange                // 2 tags matched
    ],
[3] =>[ 
     [id]=>5,
     [tags]=>Orange,Blackberry,Banana   // 2 tags matched
    ],
[4] =>[ 
     [id]=>4,
     [tags]=>Blackberry,Orange          // 1 tag matched
    ]
  

Как этого добиться в php?

Комментарии:

1. Вы просто просите нас сделать вашу работу за вас? Если у вас возникла проблема с чем-то, что вы пробовали, вы можете спросить об этом, иначе вы, вероятно, не получите надежной помощи

Ответ №1:

OP этого не заслуживает, но о возможном решении

 <?php
error_reporting(E_ALL);
ini_set('display_errors',1);

$toSort = [
     ['id'=>1,'tags'=>'Apple,Banana,Mango']
    ,['id'=>2,'tags'=>'Apple,Mango,Banana,Orange']
    ,['id'=>3,'tags'=>'Mango,Orange']
    ,['id'=>4,'tags'=>'Blackberry,Orange']
    ,['id'=>5,'tags'=>'Orange,Blackberry,Banana']

];

$tags_str = "Mango,Banana,Orange";

$tagSearch = explode(',',$tags_str);
foreach ($toSort as amp;$v) {
    $v['m'] = count(array_intersect($tagSearch,explode(',',$v['tags'])));
}

uasort($toSort,function ($a,$b){
    return $b['m']-$a['m'];
});

print_r($toSort);