PHP在对象数组中查找匹配的属性值

时间:2014-12-23 11:17:45

标签: php arrays

我有一组自定义对象,我想找到具有匹配属性值的对象。

这是我的object.php:

class game_list
{
    var $team_name;
    var $field_nr;
    var $time;

    /**
     * @return mixed
     */
    public function getTeamName()
    {
        return $this->team_name;
    }

    /**
     * @param mixed $team_name
     */
    public function setTeamName($team_name)
    {
        $this->team_name = $team_name;
    }

    /**
     * @return mixed
     */
    public function getFieldNr()
    {
        return $this->field_nr;
    }

    /**
     * @param mixed $field_nr
     */
    public function setFieldNr($field_nr)
    {
        $this->field_nr = $field_nr;
    }

    /**
     * @return mixed
     */
    public function getTime()
    {
        return $this->time;
    }

    /**
     * @param mixed $time
     */
    public function setTime($time)
    {
        $this->time = $time;
    }
}

所以我有一个包含x个这些对象的数组。我想找到具有相同$field_nr$time值的对象。例如:

如果我的阵列上有两个对象,X和Y,都有$field_nr = 1$time = "12:00",我想打印出“匹配!”。

这就是我目前正在做的事情:

//getPlaySchedule returns my array($feedback) of objects
$feedback= getPlaySchedule($cup_name, $cup_year, $division);

for($x=0; $x<count($feedback); $x++){
    $time = $feedback[$x]->getTime();
    $field = $feedback[$x]->getFieldNr();
    $team = $feedback[$x]->getTeamName();

    for($y=0; $y<count($feedback); $y++){
        if($time == $feedback[$y]->getTime() && $field == $feedback[$y]->getFieldNr() && $team != $feedback[$y]->getTeamName()){

            echo 'Match!';
        }
    }
}

然而,我的解决方案打印出“匹配!”每场比赛两次。有没有更好的方法在我的对象数组中找到这些匹配?

马库斯

1 个答案:

答案 0 :(得分:1)

这是因为你没有存储,你检查过的内容,以及每次循环遍历整个数组。例如,如果你有对象A,B,C,D,E,F,首先检查A.假设,A将匹配D.当你检查D时,D将匹配A.

所以你需要将它存储到一个数组中,或插入一个指针,已经检查过的对象,当签入D时,跳过A,B,C。

一个可能的解决方案,如果您在我的示例$z中设置了一个计数器,并从中开始第二个循环。这会阻止脚本再次检查您已检查过的内容。代码未经测试。

$z = 0;
for ($x = 0; $x < count($my_array); $x++) {
    $time = $feedback[$x]->getTime();
    $field = $feedback[$x]->getFieldNr();
    $team = $feedback[$x]->getTeamName();
    for ($y = $z; $y < count($my_array); $y++) {
        if ($time == $feedback[$y]->getTime() && $field == $feedback[$y]->getFieldNr() && $team != $feedback[$y]->getTeamName()) {
            echo 'Match!';
        }
    }
    $z++;
}