include 'database.php';
require 'vendor/autoload.php';
// Подключаем класс для работы с api Vk
// описывать его его функции не имеет смысла я думаю
// просто вызовы доступных методов api и получение
// данных в удобном для нас виде
require_once('lib/VK.php');
// ID пользователя для анализа
// может быть любой, назовем его рутом
$user_id = '11851446';
// Создаем экземпляр через который будем все дергать
$vk_api = new VK();
// Получаем массив с id друзей рута
$friends = $vk_api->getUserFriends($user_id);
// Получаем n последних саписей со стены
// в данном случае 20
$feed = $vk_api->getFeedItems($user_id, 20);
// Узнаем кто и сколько лайкал последние n записей
$friends_likes = $vk_api->getLikesForUserByItems($feed, $user_id, $friends);
// Сохраняем в таблицу, чтоб при след. запуске не тратить время
Likes::create([
'user_id' => $user_id,
'likes' => serialize($friends_likes)
]);
// Добавляем в массив друзей рута его самого
$friends[] = $user_id;
// Оставляем только уникальные id друзей
$friends = array_unique($friends);
// Прохожим по всем участникам сети
foreach ($friends as $friend) {
// Если для текущего пользователя
// нет данных по его стене и количеству лайков
if (Likes::where('user_id', $friend)->count() == 0) {
// Берем n записей с его стены
$temp_feed = $vk_api->getFeedItems($friend, 20);
// Узнаем кто и сколько лайкал последние n записей
$temp_likes = $vk_api->getLikesForUserByItems($temp_feed, $friend, $friends);
// Сохраняем в таблицу, чтоб при след. запуске не тратить время
Likes::create([
'user_id' => $friend,
'likes' => serialize($temp_likes)
]);
}
}
// Теперь у нас есть данные о все участника сети
// кто и сколько раз лайкал последние n записей на стене
// из тех кто находится в друзьях у рута ну и сам рут
// Берем данные о все участниках сети
// и находим максимальное количество лайков
// кого то на какой то стене
$all_likes = Likes::all();
$max_score = 0;
foreach ($all_likes as $like) {
$other_users = unserialize($like->likes);
foreach ($other_users as $k => $v) {
if ($v > $max_score) $max_score = $v;
}
}
// Снова пробежимся по всем юзерам
// и запишем кто на кого и как влияет
foreach ($all_likes as $like) {
// Установим для каждого порог от 0 до 0.5
Thresholds::create([
'user_id' => $like->user_id,
'value' => mt_rand(1, 5) / 10
]);
$from = $like->user_id;
$other_users = unserialize($like->likes);
foreach ($other_users as $k => $v) {
if (Influences::where('from', $from)
->where('to', $k)->count() == 0) {
Influences::create([
// кто то
'from' => $from ,
// на кого то
'to' => $k,
// вот так
'score' => $v/$max_score
]);
}
}
}
// Получим все влияния
$influences = Influences::select('from')
->groupBy('from')->get()->toArray();
// Наполним массив данными
// на какое количество пользователей
// повлиял каждый юзер
$temp_data = [];
foreach ($influences as $i) {
$temp_data[$i['from']] = Influences::
where('from', $i['from'])->count();
}
// Отсортируем поубиванию
arsort($temp_data);
// На них уже повлияли
$already_affected = [];
// Кто повлиял
$who_influenced = [];
// На кого осталось повлиять
$should_affect = $temp_data;
// Кто может повлиять
$who_can_influence = $temp_data;
// Идем по всем кто может повлиять
foreach ($who_can_influence as $user => $v) {
// $user = id юзера
// $v = сколько человек может заразить один
// Берем всех кого может заразить
$temp_affected = Influences::where('from', $user)
->get()->toArray();
// пробегаемся по каждому
foreach ($temp_affected as $p) {
// для каждого получаем его порог
$thresholds = Thresholds::where('user_id', $p['to'])
->first()->value;
// если его порог меньше чем влияние юзера
if ($thresholds <= $p['score']) {
// удаляем его и того кто на него повлиял из списка
// нуждающихся в заражениии
unset($should_affect[$p['to']], $should_affect[$user]);
// Добавляем +1 к тому юзеру который заразил
if (isset($who_influenced[$user])) {
$who_influenced[$user] += 1;
} else {
$who_influenced[$user] = 1;
}
}
}
}
// Остались самые стойкие которых одному не заразить
// пробежимся по ним
foreach ($should_affect as $user_id => $v) {
// $user = id юзера
// $v = сколько человек может заразить один
// $summ_people = id пользователей которые пытаются влиять на юзера вместе
$summ_people = [];
// получаем порог стойкого юзера
$thresholds = Thresholds::where('user_id', $user_id)
->first()->value;
// получем всех кто на него пытался влиять
$temp_affected = Influences::where('to', $user_id)
->get()->toArray();
// Найдем их суммарное влияние
$sum_thresholds = 0;
foreach ($temp_affected as $a) {
// Если их сммарного влияния достаточно
// удаляем его и того кто на него повлиял из списка
// нуждающихся в заражениии
if ($sum_thresholds >= $thresholds) {
unset($should_affect[$user_id]);
foreach ($summ_people as $people) {
unset($should_affect[$people]);
if (isset($who_influenced[$people])) {
$who_influenced[$people] += 1;
} else {
$who_influenced[$people] = 1;
}
}
break;
}
$sum_thresholds += $a['score'];
$summ_people[] = $a['from'];
}
}