Dynamic Array & Array_unintersect_assoc() ||Array_unintersect()



在与对象的动态数组进行比较时遇到困难。

对象:

class Skill
{
    public $SkillID;
    public $Profficiency;
    public $Required;
    public $Source;
    public function __construct($SkillID,$Prof,$Req,$Src){
        $this->SkillID = $SkillID;
        $this->Profficiency = $Prof;
        $this->Required = $Req;
        $this->Source = $Src;
    }
}

我所做的是给两个人分配他们的技能。人A &B可以有任意数量的技能。Skill::Source通过一个布尔值标识它来自于person A。

$SkillMatches = array_uintersect_assoc($this->Person_A->Skills,$this->Person_B->Skills,array($this, 'SkillIDComparison'));
private function SkillIDComparison($Skill_A,$Skill_B){
    print_r($Skill_A);
    echo '<br>';
    print_r($Skill_B);
    echo '<br>';
    echo '<br>';
    if ($Skill_A === $Skill_B) {
        return 0;
    } elseif ($Skill_A > $Skill_B) {
        return 1;
    } else {
        return -1;
    }
}

我的问题是,如果说Person_A有5个技能,而Person_B有2个技能,Array_uintersect_assoc(),不检查Person_A的所有5个技能

Skill Object ( [SkillID] => 6 [Profficiency] => 1 [Required] => 0 [Source] => 1 ) 
Skill Object ( [SkillID] => 3 [Profficiency] => 2 [Required] => 0 [Source] => ) 
Skill Object ( [SkillID] => 7 [Profficiency] => 1 [Required] => 0 [Source] => 1 ) 
Skill Object ( [SkillID] => 5 [Profficiency] => 2 [Required] => 1 [Source] => ) 

现在,如果我使用Array_uintersect(),当调用可调用函数时,它不会将Person_A::Skills分配给$Skill_A和Person_B::Skills分配给$Skill_B,也似乎是随机的,其中技能分配给callable函数内部的参数。

$SkillMatches = array_uintersect($this->Person_A->Skills,$this->Person_B->Skills,array($this, 'SkillIDComparison'));
Skill Object ( [SkillID] => 7 [Profficiency] => 1 [Required] => 0 [Source] => 1 ) 
Skill Object ( [SkillID] => 6 [Profficiency] => 1 [Required] => 0 [Source] => 1 ) 
Skill Object ( [SkillID] => 8 [Profficiency] => 1 [Required] => 0 [Source] => 1 ) 
Skill Object ( [SkillID] => 7 [Profficiency] => 1 [Required] => 0 [Source] => 1 ) 
Skill Object ( [SkillID] => 5 [Profficiency] => 2 [Required] => 1 [Source] => ) 
Skill Object ( [SkillID] => 3 [Profficiency] => 2 [Required] => 0 [Source] => ) 
Skill Object ( [SkillID] => 6 [Profficiency] => 1 [Required] => 0 [Source] => 1 ) 
Skill Object ( [SkillID] => 3 [Profficiency] => 2 [Required] => 0 [Source] => ) 
Skill Object ( [SkillID] => 6 [Profficiency] => 1 [Required] => 0 [Source] => 1 ) 
Skill Object ( [SkillID] => 5 [Profficiency] => 2 [Required] => 1 [Source] => ) 
正如你在这里看到的,有一半的时间函数被调用,它甚至没有比较两个不同的人。只有最后两个调用才真正比较Person_A和Person_B。

在函数SkillIDComparison中收到两个对象。如果你想比较属性SkillID,那么用$Skill_A->SkillID

那么,改变下面所有的行

if ($Skill_A === $Skill_B) {
    return 0;
} elseif ($Skill_A > $Skill_B) {
    return 1;
} else {
    return -1;
}

return $Skill_A->SkillID - $Skill_B->SkillID;

使用array_uintersect,因为您想比较值而不是键。

我不知道这个结构array($this, 'SkillIDComparison')是否正确。但是,如果使用第三个参数为'SkillIDComparison',则一切正常

最新更新