PHP を扱った経験はあまりありませんが、ソーシャル ネットワークのフォロワー数の上位 10 人のユーザーを決定するための大まかなアルゴリズムを開発しました。ほぼ正しいと思われるユーザーのリストを返しますが、これには2つの問題があります。
特に多くのユーザーがいる場合は、非常に反復的でリソースを大量に消費するようです。ソート順を維持しながら、ユーザーが最後の位置よりも多くのフォロワーを持っていない場合、アルゴリズムを短絡する簡単な方法はありますか? アルゴリズムをどのように凝縮/簡素化できますか?
それは正確には機能しません。返されるユーザーのリストは、上位 10 人のユーザーではありません。たとえば、スクリプトを実行すると、54、7、6、4、1、3、2、2、1、1 の順でフォロワー数のユーザーが返されるようになりました。フォロワー数が 54 を超えるユーザーが他に少なくとも 2 人いることを確認します。さらに、5 番目のユーザーは場違いです。これは私たちのアルゴリズムの問題ですか、それとも他の何かの問題ですか (おそらくフォロワーの保存方法)?
問題のコードは次のとおりです。
$array = array(0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
$result = mysql_query("SELECT * FROM users") or die(mysql_error());;
for($i = 0; $user = mysql_fetch_array($result, MYSQL_NUM); $i++) {
if (following($user[0]) > following($array[0])) $array[0] = $user[0];
else if (following($user[0]) > following($array[1])) $array[1] = $user[0];
else if (following($user[0]) > following($array[2])) $array[2] = $user[0];
else if (following($user[0]) > following($array[3])) $array[3] = $user[0];
else if (following($user[0]) > following($array[4])) $array[4] = $user[0];
else if (following($user[0]) > following($array[5])) $array[5] = $user[0];
else if (following($user[0]) > following($array[6])) $array[6] = $user[0];
else if (following($user[0]) > following($array[7])) $array[7] = $user[0];
else if (following($user[0]) > following($array[8])) $array[8] = $user[0];
else if (following($user[0]) > following($array[9])) $array[9] = $user[0];
}
この後、配列を MySQL テーブルに入力します。前もって感謝します。
編集: ここにフォロワー関数のコードがあります。
function followers($id){
$query = mysql_query("SELECT * FROM follow WHERE following='$id' AND follower!='$id'");
return mysql_num_rows($query);
}