Iki farklı veri setleri (Facebook & MySQL) veri birleştirme

6 Cevap php

Bu sorunu çözmek için en iyi yol olup olmadığını merak ediyorum. Ben (facebook dan - Bir çok dizi döndürür), bir Facebook kullanıcılarının arkadaş verileri birleştirme am (MySQL) olarak bu listedeki kullanıcıların oy.

Bu benim bu başarılı nasıl. Ben junior geliştirici yaşıyorum ve mümkün olduğunca optimize kodumu yapmaya yardım arıyor.

public function getFriendVotes(){
    global $facebook;

    // Get The users friends that use this app from facebook
    $friends = $facebook->api_client->fql_query(
      "SELECT uid, first_name, last_name
        FROM user
        WHERE uid IN (SELECT uid2 FROM friend WHERE uid1=$this->user)"
    );

    // Create an array of just the ids
    foreach($friends as $friend){
      $userids[] = $friend['uid'];
    }

    // Create a string of these ids
    $idstring = implode(",", $userids);

    // Get the votes from only the users in that list that voted
    $result = $this->db->query(
      "SELECT vote, userid FROM user_votes WHERE userid IN ($idstring)"
    );

    // Create a new result set (multi array).  Include the data from the first
    // Facebook query, but include only those who voted and append their votes
    // to the data
    $row = $result->fetch_assoc();
    foreach($friends as $friend){
      if($row['userid'] == $friend['uid']){
        $return[$count] = $friend;
        $return[$count]['vote'] = $row['vote'];
        $row = $result->fetch_assoc();
        $count++;
      }
    }
    return $return;
}

6 Cevap

Ben fql_query destek mysql sözdizimi yaptığı asume ve bunun yerine ekstra sorgu creatig JOIN SOL kullanmak daha verimli olacaktır, burada kod benim sürümü:

public function getFriendVotes(){
    global $facebook;

    // Get The users friends that use this app from facebook
    $friends = $facebook->api_client->fql_query("
    	SELECT DISTINCT u.uid,u.first_name,u.last_name 
    	FROM user AS u 
    	LEFT JOIN friend AS f ON uid=uid2 
    	WHERE f.uid1='{$this->user}'
    ");
    $arrayUsers = array();
    // Create an array of just the ids
    foreach($friends as $v){
    	$arrayUsers[$friend['uid']] = $v;
    }
    unset($friends);

    // Create a string of these ids
    $idstring = implode(",", array_keys($arrayUsers));

    // Get the votes from only the users in that list that voted
    $result = $this->db->query(
      "SELECT vote, userid FROM user_votes WHERE userid IN ({$idstring})"
    );

    $result = array();
    // Create a new result set (multi array).  Include the data from the first
    // Facebook query, but include only those who voted and append their votes
    // to the data
    while($v = $result->fetch_assoc())
    {
    	if(isset($arrayUsers[$v['userid']])
    	{

    		$arrayUsers[$v['userid']] = $v['vote'];

    		$result[] = $arrayUsers[$v['userid']];

    		unset($arrayUsers[$v['userid']], $v);
    	}
    }

    return $return;
}

Senin kod ölçme ve test olmadan gerçekleştirmek nasıl anlatamam. Ben biraz daha okunabilir / maintanable yapacak kod ile diğer konular, olmazdı. Örneğin:

Create smaller methods.

Ana yöntem içinde, ben de yorumladı kod bazı parçalarını bakın. Yerine neden ana yönteminde büyük bir yorum yapma yöntemi oluşturmak değil mi?

Örneğin:

// Get The users friends that use this app from facebook
$friends = $facebook->api_client->fql_query(
  "SELECT uid, first_name, last_name
    FROM user
    WHERE uid IN (SELECT uid2 FROM friend WHERE uid1=$this->user"
);
return $friends;

Bir ilginç kılacak

functin get_users_friends_from_facebook($facebook){
    // Get The users friends that use this app from facebook
    $friends = $facebook->api_client->fql_query(
      "SELECT uid, first_name, last_name
        FROM user
        WHERE uid IN (SELECT uid2 FROM friend WHERE uid1=$this->user"
    );
    return $friends;
}

Aynı şekilde,

// Get the votes from only the users in that list that voted
$result = $this->db->query(
  "SELECT vote, userid FROM user_votes WHERE userid IN ($idstring)"
);

Için iyi bir aday

function get_votes_from_voters(){
    // Get the votes from only the users in that list that voted
    $votes = $this->db->query(
      "SELECT vote, userid FROM user_votes WHERE userid IN ($idstring)"
    );
}

Give variables meaningful names to the context.

$return iyi bir isim değil. Neden $users_votes, örneğin bir isim değil mi?

Try to keep the naming convention of your plataform.

Kullandığınız API'lerini edin. Onlar camelCase kullanıyor musunuz? Onlar çizgi kullanıyor musunuz? Lütfen kütüphaneler ve plataform kuralları ile tutmaya çalışın. İyi bir referans için this topic edin.

Ve SO hoş geldiniz. Sizin kod gayet iyi. Bazı OO ilkelerini okumak için çalışın, hatta daha fazla kod satırlarını kesilmiş olabilir. Ben burada yazdı tüm basit önerileri adlı büyük kitabında avaiable Code Complete.

Ben tüm yorumlardan puan aldı ve aşağıda bu yöntemi yeniden yazdım. Bütün büyük giriş için teşekkür ederiz.

public function getAppUserFriends(){
    global $facebook;
    return $facebook->api_client->fql_query(
        "SELECT uid, first_name, last_name
        FROM user
        WHERE uid IN (SELECT uid2 FROM friend WHERE uid1=$this->user)
        AND is_app_user;"
    );
}

public function getFriendVotes(){

    // Get the users friends that use this app
    $friends = $this->getAppUserFriends();

    // Create an array with the ids as the key
    foreach($friends as $v){
        $arrayFriends[$v['uid']] = $v;
    }

    // Create a string of these ids
    $idString = implode(",", array_keys($arrayFriends));

    // Get the votes from only the users in that list that voted
    $result = $this->db->query(
        "SELECT vote, userid
        FROM user_votes
        WHERE pollid=$this->poll
        AND userid IN ($idString)"
    );

    // Pluck out user data from facebook array where the user has voted
    // and add the vote to that array
    while($row = $result->fetch_assoc()){
        $friendsVotes[$row['userid']] = $arrayFriends[$row['userid']];
        $friendsVotes[$row['userid']]['vote'] = $row['vote'];
    }
    return $friendsVotes;
}

Bu yöntemde performans sorun yaşıyor musunuz? Eğer sürece çünkü, optimize etmek gerek yoktur.

Kod ilk olarak, kod profil ve en iyi yapar sonra nereye optimize.

$friends = $facebook->api_client->fql_query(
  "SELECT uid, first_name, last_name
    FROM user
    WHERE uid IN (SELECT uid2 FROM friend WHERE uid1=$this->user"
);

Muhtemelen kısaltılmış olabilir

$userids = $facebook->api_client->fql_query(
  "SELECT uid
    FROM user
    WHERE uid IN (SELECT uid2 FROM friend WHERE uid1=$this->user)"
);

uid Eğer fb kullanıyor görünüyor tek şey, çünkü

Bana ne yapmaya çalışıyorsun ne söylemek için biraz zor oldu, ama PHP'nin array_intersect (ve onun kuzenleri) bakarak düşünebilirsiniz.

A = {1:'fred', 2:'bob'}
B = {1: 2, 3: 0}

C = array_intersect( array_keys(A), array_keys(B) )
D = {}
foreach (C as c) {
  D[c] = (A[c], B[c])
}

Sözdizimi orada kapalı ama doğru yönde size yol umuyoruz.