2016-05-04 6 views
0

Ich arbeite an der Verwendung , um zu überprüfen, ob ein Course Objekt namens Course in einem Array ist.Ändern der Art und Weise PHP in_array Objektvergleich

Ein Problem, das ich habe, ist, ich möchte eine bestimmte Eigenschaft innerhalb meiner Course Objekt, um den Objektvergleich zu tun, anstelle von Vergleich des gesamten Objekts.

Insbesondere möchte ich die $course->getShortName() verwenden, um den Vergleich zu tun. Warum? Weil alle anderen privaten Variablen in meinem Course-Objekt unterschiedlich sein können, mit Ausnahme der Eigenschaft short_name, die gleich bleiben kann, und deshalb möchte ich sie für die Objekteigenschaft verwenden.

Methode, die den Vergleich tut:

public function overlap($courses, $course_temp) { 
    for ($i = 0; $i < count($courses); $i = $i + 1) { 
     if ($this->overlapCourses($courses[$i], $course_temp)) { 
      // Push the class that is conflicted to the conflictedClass 
      // array 
      // TODO: Figure out why it's being added to the list 
      if(!in_array($courses[$i], $this->conflictClasses)) { 
       array_push($this->conflictClasses, $courses[$i]); 
      } 

      // Push the class that is conflicted with to the 
      // conflictedClass array 
      // TODO: Figure out why it's being added to the list 
      if(!in_array($course_temp, $this->conflictClasses)) { 
       array_push($this->conflictClasses, $course_temp); 
      } 
      return false; 
     } 
    } 
    return false; 
} 

Getter aus meiner Course Klasse

public function getShortName(){ 
    return $this->short_name; 
} 

tl;dr: Statt Objekt zu vergleichen, vergleichen Eigenschaft des Objekts

+0

Sie können das Verhalten von in_array nicht ändern, aber vielleicht ist das hilfreich: http://php.net/manual/de/function.array-uintersect.php – colburton

Antwort

1

Ich kann keine vorhandenen f sehen Salbung, die hier gelten würde. Sie könnten verwenden array_filter ausführen, was Sie wollen:

function object_in_array($needle, array $array, $method) { 
    $propertyToMatch = $needle->$method(); 
    // the $matches var will contain all the objects that have the property matching your object property 
    $matches = array_filter($array, function($object) use ($propertyToMatch, $method) { 
     return $propertyToMatch === $object->$method(); 
    }); 

    // If there is at least 1 result, your object property is matching one of your array of objects 
    return count($matches) > 0; 
} 

Nutzungs

if (object_in_array($myObject, $courses, 'getShortName')) { 
    .... 
} 

Natürlich sollten Sie überprüfen, ob die $ method Methode existiert und Ausnahmen auslösen, wenn nicht.

+0

Vielen Dank! Was ist der große O von array_filter? – theGreenCabbage

+0

Entschuldigung? ich verstehe deine Frage nicht – jiboulex