-
-
Save levelsio/46f6c342ec03cd9013bb72e1f45caf9e to your computer and use it in GitHub Desktop.
/* | |
code to match for dating | |
these are BOOLEAN values | |
match_gender = the gender of the user itself | |
match_target_gender = the gender of the target user | |
if match_gender_male = true it means the user is a male | |
if match_target_gender_male = true it means the user is looking for a male | |
I need to match for example: | |
User is a female that likes male, target user is a male that likes female | |
User is a male that likes male, target user is a male that likes male | |
etc. | |
I think my current code has some bugs, it seems to match for example target female that likes male with male that likes male, can u help me? | |
*/ | |
if( | |
( | |
($user['match_target_gender_male'] && $targetUser['match_target_gender_male'] && $user['match_gender_male']) || | |
($user['match_target_gender_female'] && $targetUser['match_target_gender_female'] && $user['match_gender_female']) || | |
($user['match_target_gender_trans'] && $targetUser['match_target_gender_trans'] && $user['match_gender_trans']) || | |
($user['match_target_gender_other'] && $targetUser['match_target_gender_other'] && $user['match_gender_other']) || | |
($user['match_target_gender_male'] && $user['match_target_gender_male'] && $targetUser['match_gender_male']) || | |
($user['match_target_gender_female'] && $user['match_target_gender_female'] && $targetUser['match_gender_female']) || | |
($user['match_target_gender_trans'] && $user['match_target_gender_trans'] && $targetUser['match_gender_trans']) || | |
($user['match_target_gender_other'] && $user['match_target_gender_other'] && $targetUser['match_gender_other'])) | |
) | |
&& | |
( | |
($user['match_want_relationship'] && $targetUser['match_want_relationship']) || | |
($user['match_want_casual'] && $targetUser['match_want_casual']) || | |
($user['match_want_open'] && $targetUser['match_want_open'])) | |
) | |
) { | |
$isRomanticMatch=true; | |
} |
Here is some kind of decorator for User's with Match capabilities. One could take the logic out of wantTheSame & compatibleTarget if you don't want the classes. But I think this improves readability a lot.
Put some simple test at the end of the class.
class UserMatcher
{
public $gender;
public $target_gender;
public $want;
public function __construct($user)
{
$this->gender = [
'male' => $user['match_gender_male'],
'female' => $user['match_gender_female'],
'trans' => $user['match_gender_trans'],
'other' => $user['match_gender_other']
];
$this->target_gender = [
'male' => $user['match_target_gender_male'],
'female' => $user['match_target_gender_female'],
'trans' => $user['match_target_gender_trans'],
'other' => $user['match_target_gender_other'],
];
$this->want = [
'relationship' => $user['match_want_relationship'],
'casual' => $user['match_want_casual'],
'open' => $user['match_want_open'],
];
}
public function wantTheSame($target_user)
{
return (
$this->want['relationship'] && $target_user->want['relationship'] ||
$this->want['casual'] && $target_User->want['casual'] ||
$this->want['open'] && $target_user->want['open']
);
}
public function compatibleTarget($target_user)
{
return (
$this->target_gender['male'] && $target_user->gender['male'] ||
$this->target_gender['female'] && $target_user->gender['female'] ||
$this->target_gender['trans'] && $target_user->gender['trans'] ||
$this->target_gender['other'] && $target_user->gender['other']
);
}
public function isRomanticMatch($target_user)
{
return (
$this->compatibleTarget($target_user) &&
$target_user->compatibleTarget($this) &&
$this->wantTheSame($target_user)
);
}
};
$male_looking_for_male = [
'match_gender_male' => true,
'match_gender_female' => false,
'match_gender_trans' => false,
'match_gender_other' => false,
'match_target_gender_male' => true,
'match_target_gender_female' => false,
'match_target_gender_trans' => false,
'match_target_gender_other' => false,
'match_want_relationship' => true,
'match_want_casual' => true,
'match_want_open' => true,
];
$male_looking_for_female = [
'match_gender_male' => true,
'match_gender_female' => false,
'match_gender_trans' => false,
'match_gender_other' => false,
'match_target_gender_male' => false,
'match_target_gender_female' => true,
'match_target_gender_trans' => false,
'match_target_gender_other' => false,
'match_want_relationship' => true,
'match_want_casual' => true,
'match_want_open' => true,
];
$user_match = new UserMatcher($male_looking_for_male);
$target_match = new UserMatcher($male_looking_for_male);
echo 'R1:'.$user_match->isRomanticMatch($target_match).PHP_EOL;
$user_match = new UserMatcher($male_looking_for_female);
$target_match = new UserMatcher($male_looking_for_male);
echo 'R2:'.$user_match->isRomanticMatch($target_match).PHP_EOL;
$female_looking_for_male = [
'match_gender_male' => false,
'match_gender_female' => true,
'match_gender_trans' => false,
'match_gender_other' => false,
'match_target_gender_male' => true,
'match_target_gender_female' => false,
'match_target_gender_trans' => false,
'match_target_gender_other' => false,
'match_want_relationship' => true,
'match_want_casual' => true,
'match_want_open' => true,
];
$user_match = new UserMatcher($male_looking_for_female);
$target_match = new UserMatcher($female_looking_for_male);
echo 'R3:'.$user_match->isRomanticMatch($target_match).PHP_EOL;
I don't know why your conditions are something like: user['match_target_gender_male'] && $targetUser['match_target_gender_male'] && $user['match_gender_male']
When I see what I want and what is my target sex, my own sex doesn't matters (see compatibleTarget method). So, you only need to check if target is compatible with my preferences and if I'm compatible with target preferences.
If you consider refactoring how you're structuring the data like this:
$user['match_target_relationship'] = "open"
$user['match_gender'] = "male"
$user['match_target_genders'] = ["male", "female"]
(assuming people can have multiple target genders)
Then you can simplify it:
/*
if we both want same relationship AND they want my gender AND I want their gender => ❤️
*/
if (
$user['match_target_relationship'] == $targetUser['match_target_relationship'] &&
in_array($user['match_gender'], $targetUser['match_target_genders']) &&
in_array($targetUser['match_gender'], $user['match_target_genders'])
) {
$isRomanticMatch = true;
}
@fabiogiolito Thiiiiiiiiiiis