-
-
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; | |
} |
Looking at the first line there:
$user['match_target_gender_male'] && $targetUser['match_target_gender_male'] && $user['match_gender_male']
= user wants male, target wants male, user is male
doesn't consider if target is also male
$user['match_target_gender_male'] && $targetUser['match_target_gender_male'] && $user['match_gender_male'])
you need to add && $targetUser['match_gender_male']
here too (assuming this is male to male)
Repeat for your other lines
Unrelated to the bug, but could be a good idea to invert the IF. Check if they want a relationship first, if that fails the more complex part of the IF is ignored instead of going through all possibilities.
Is there a reason you're doing $user['match_target_gender_male']
instead a key value with an array, something like $user['match_target_gender'] = ["male", "female"]
?
Doing that way would simplify your checks a lot. You could just check if ( in_array($targetUser['match_gender'], $user['match_target_gender']) && …) {}
function user_match_gender($user_a, $user_b) {
$result = false;
$gender = array(
'match_target_gender_male' => 'match_gender_male',
'match_target_gender_female' => 'match_gender_female',
'match_target_gender_trans' => 'match_gender_trans',
'match_target_gender_other' => 'match_gender_other',
);
foreach($gender as $key => $value) {
if($user_a[$key] && $user_b[$value]) {
$result = true;
break;
}
}
return $result;
}
function user_match_relationship($user_a, $user_b) {
$result = false;
$relationships = array(
'match_want_relationship',
'match_want_casual',
'match_want_open'
);
foreach($relationships as $value) {
if($user_a[$value] && $user_b[$value]) {
$result = true;
break;
}
}
return $result;
}
if(
user_match_gender($user, $target_user) &&
user_match_gender($target_user, $user) &&
user_match_relationship($user, $target_user)
) {
$isRomanticMatch = true;
}
Keeping your coding style, the full copy-paste fix would be this:
if(
(
($user['match_want_relationship'] && $targetUser['match_want_relationship']) ||
($user['match_want_casual'] && $targetUser['match_want_casual']) ||
($user['match_want_open'] && $targetUser['match_want_open'])
)
&&
(
($user['match_gender_male'] && $user['match_target_gender_male'] && $targetUser['match_gender_male'] && $targetUser['match_target_gender_male']) ||
($user['match_gender_male'] && $user['match_target_gender_female'] && $targetUser['match_gender_female'] && $targetUser['match_target_gender_male']) ||
($user['match_gender_male'] && $user['match_target_gender_trans'] && $targetUser['match_gender_trans'] && $targetUser['match_target_gender_male']) ||
($user['match_gender_male'] && $user['match_target_gender_other'] && $targetUser['match_gender_other'] && $targetUser['match_target_gender_male']) ||
($user['match_gender_female'] && $user['match_target_gender_male'] && $targetUser['match_gender_male'] && $targetUser['match_target_gender_female']) ||
($user['match_gender_female'] && $user['match_target_gender_female'] && $targetUser['match_gender_female'] && $targetUser['match_target_gender_female']) ||
($user['match_gender_female'] && $user['match_target_gender_trans'] && $targetUser['match_gender_trans'] && $targetUser['match_target_gender_female']) ||
($user['match_gender_female'] && $user['match_target_gender_other'] && $targetUser['match_gender_other'] && $targetUser['match_target_gender_female']) ||
($user['match_gender_trans'] && $user['match_target_gender_male'] && $targetUser['match_gender_male'] && $targetUser['match_target_gender_trans']) ||
($user['match_gender_trans'] && $user['match_target_gender_female'] && $targetUser['match_gender_female'] && $targetUser['match_target_gender_trans']) ||
($user['match_gender_trans'] && $user['match_target_gender_trans'] && $targetUser['match_gender_trans'] && $targetUser['match_target_gender_trans']) ||
($user['match_gender_trans'] && $user['match_target_gender_other'] && $targetUser['match_gender_other'] && $targetUser['match_target_gender_trans']) ||
($user['match_gender_other'] && $user['match_target_gender_male'] && $targetUser['match_gender_male'] && $targetUser['match_target_gender_other']) ||
($user['match_gender_other'] && $user['match_target_gender_female'] && $targetUser['match_gender_female'] && $targetUser['match_target_gender_other']) ||
($user['match_gender_other'] && $user['match_target_gender_trans'] && $targetUser['match_gender_trans'] && $targetUser['match_target_gender_other']) ||
($user['match_gender_other'] && $user['match_target_gender_other'] && $targetUser['match_gender_other'] && $targetUser['match_target_gender_other'])
)
) {
$isRomanticMatch=true;
}
@fabiogiolito Thiiiiiiiiiiis
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;
}
Did a refactor.
You seem to check checking the top level stuff twice??