2014-12-23 3 views
1

У меня есть массив пользовательских объектов, и я хочу найти объекты, которые имеют соответствующие значения свойств.PHP найти значения свойств соответствия в массиве объектов

Это мой 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; 
    } 
} 

Так у меня есть массив с й числом этих объектов. Я хочу найти объекты с одинаковыми значениями $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!'; 
     } 
    } 
} 

Мое решение, однако, печатает два раза за каждый матч. Есть ли лучший способ найти эти совпадения в моем массиве объектов?

Marcus

ответ

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

Конечно! Вы спасли моего мистера, хорошее объяснение и да, ваш код работал. Спасибо, счастливые праздники! – Marcus

+0

Добро пожаловать. Счастливые праздники для вас тоже! – vaso123

Смежные вопросы