Skip to content

Instantly share code, notes, and snippets.

@levelsio
Last active April 6, 2018 15:53
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • 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

function maleSeekingMale($user, $targetUser) {
  return $user['match_target_gender_male'] && $targetUser['match_target_gender_male'] && $user['match_gender_male'];
}

function femaleSeekingFemale($user, $targetUser) {
  return $user['match_target_gender_female'] && $targetUser['match_target_gender_female'] && $user['match_gender_female'];
}

function transSeekingTrans($user, $targetUser) {
  return $user['match_target_gender_trans'] && $targetUser['match_target_gender_trans'] && $user['match_gender_trans'];
}

function otherSeekingOther($user, $targetUser) {
  return $user['match_target_gender_other'] && $targetUser['match_target_gender_other'] && $user['match_gender_other'];
}

function bothWantRelationship($user, $targetUser) {
 return $user['match_want_relationship'] && $targetUser['match_want_relationship'];
}

function bothWantCasual($user, $targetUser) {
 return $user['match_want_casual'] && $targetUser['match_want_casual'];
}

function bothWantOpen($user, $targetUser) {
 return $user['match_want_open'] && $targetUser['match_want_open'];
}
if(
	(
		(maleSeekingMale($user, $targetUser)) ||
		(femaleSeekingFemale($user, $targetUser)) ||
		(transSeekingTrans($user, $targetUser)) ||
		(otherSeekingOther($user, $targetUser)) ||
		(maleSeekingMale($user, $targetUser)) ||
		(femaleSeekingFemale($user, $targetUser)) ||
		(transSeekingTrans($user, $targetUser)) ||
		(otherSeekingOther($user, $targetUser)) ||
	)
		&&
	(
		(bothWantRelationship($user, $targetUser)) ||
		(bothWantCasual($user, $targetUser)) ||
		(bothWantOpen($user, $targetUser)))
	)
) {
	$isRomanticMatch=true;
}

Did a refactor.

You seem to check checking the top level stuff twice??

@fabiogiolito
Copy link

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

@keenahn
Copy link

keenahn commented Apr 6, 2018

$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

@fabiogiolito
Copy link

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']) && …) {}

@jamesmbeams
Copy link

jamesmbeams commented Apr 6, 2018

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;

}

@fabiogiolito
Copy link

fabiogiolito commented Apr 6, 2018

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

@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