Skip to content

Instantly share code, notes, and snippets.

@levelsio
Last active April 6, 2018 15:53
Show Gist options
  • Save levelsio/46f6c342ec03cd9013bb72e1f45caf9e to your computer and use it in GitHub Desktop.
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;
}
@jasper-lyons-rhul
Copy link

@fabiogiolito Thiiiiiiiiiiis

@lcjury
Copy link

lcjury commented Apr 6, 2018

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.

@fabiogiolito
Copy link

fabiogiolito commented Apr 6, 2018

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;
}

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment