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']; } }