1

オブジェクトの動的配列と比較しようとすると問題が発生します。

物体:

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

私がやっていることは、2 人にスキルのセットを割り当てることです。Person A & B は、スキルをいくつでも持つことができます。Skill::Source は、ブール値を介して人物 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] => ) 

ここでわかるように、関数が呼び出される時間の半分は、2 人の異なる人から比較することすらありません。Person_A と Person_B を実際に比較するのは、最後の 2 つの呼び出しだけです。

任意の支援をいただければ幸いです、ありがとう。

4

1 に答える 1

0

function で 2 つのオブジェクトを受け取ります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')この構造が正しいかどうかはわかりません。しかし、3 番目の引数を「SkillIDComparison」として使用すると、すべて正常に動作します

于 2015-05-29T19:20:59.847 に答える