0

私のmongodbデータベースにはユーザーのリストがあり、相互にフォローできます-かなり標準です。PHP を使用して、特定のユーザーが別のユーザーをフォローしているかどうかを確認したいと考えています。私のデータは次のようになります。

array (
  '_id' => ObjectId("56759157e1095db549d63af1"),
  'username' => 'Joe',
  'following' => 
  array (
    0 => 
    array (
      'username' => 'John',
    ),
    1 => 
    array (
      'username' => 'Tom',
    ),
  ),
)
array (
      '_id' => ObjectId("56759132e1095de042d63af4"),
      'username' => 'Tom',
      'following' => 
      array (
        0 => 
        array (
          'username' => 'Joe',
        ),
        1 => 
        array (
          'username' => 'John',
        ),
        2 => 
        array (
          'username' => 'Sam',
        ),
      ),
    )

Joe が Sam をフォローしているかどうか (彼はフォローしていない) をチェックするクエリが必要です。そのため、結果は生成されません。ただし、Tom が Sam をフォローしているかどうかを確認するためにデータベースにクエリを実行すると、Tom が Sam をフォローしていることを示す結果が生成されます (彼がフォローしているため)。PHPでこれを行う方法を知っていますか?Foreach ループを試してみましたが、必要な結果を得ることができませんでした。

4

2 に答える 2

0

このようなクエリは SQL で行うのが最適ですが、PHP ベースのソリューションを強く求める場合は、データ構造を名前でキー付けされた項目に変換することをお勧めします。それができたら、関係を見つけるのは簡単です。

function organisePersons($data) {
    $persons = array();
    foreach($data as $person) {
        $list = array();
        foreach($person["following"] as $following) {
            $list[$following["username"]] = $following["username"];
        }
        $person["following"] = $list;
        $person["followedBy"] = array();
        $persons[$person["username"]] = $person;
    }
    // link back to get all "followedBy":
    // You can skip this block if you don't need "followedBy":
    foreach ($persons as $person) {
        foreach($person["following"] as $following) {
            echo $person["username"] . " f. $following<br>";
            if (!isset($persons[$following])) {
                $persons[$following] = array(
                    "_id" => null, // unknown
                    "username" => $following,
                    "following" => array(),
                    "followedBy" => array()
                );
            }
            $persons[$following]["followedBy"][] = $person["username"];
        }
    }
    // return the new structure
    return $persons;
}

したがって、最初に、持っているデータを使用して上記の関数を呼び出します。

$persons = organisePersons($data);

そして、これを書くことができます:

if (isset($persons["Joe"]["following"]["Sam"])) {
    echo "Joe is following Sam";  // not in output
};
if (isset($persons["Tom"]["following"]["Sam"])) {
    echo "Tom is following Sam";  // in output
};

だけでなく:

echo "Tom is following " . implode($persons["Tom"]["following"], ", ");
// Output: Tom is following Joe, John, Sam

そして、逆の質問「Tom の後に続くのは誰ですか?」

echo "Tom is followed by " . implode($persons["Tom"]["followedBy"], ", ");
// Output: Tom is followed by Joe
于 2015-12-19T23:11:57.163 に答える