Versio

OOP vraagje

Overzicht Reageren

Twan van der Poel

Twan van der Poel

16/03/2008 13:48:00
Quote Anchor link
Dag PHP'ers,

ik heb een functie nodig die twee arrays met objecten met elkaar kan vergelijken en de verschillen als array teruggeeft. Dus array_diff maar dan de object variant, ik heb al een poosje gegoogled maar het mocht niet baten.

Op php.net/array_diff staat ook een object compare functie maar die werkt niet.

Weet iemand zo iets ?

Twan
Gewijzigd op 01/01/1970 01:00:00 door Twan van der Poel
 
PHP hulp

PHP hulp

25/05/2012 13:03:29
Gesponsorde koppelingen:
BHosted Hosting al vanaf € 1,- per maand

Controleer nu gratis jouw domeinnaam:

  
 
Jelmer rrrr

Jelmer rrrr

16/03/2008 14:09:00
Quote Anchor link
Op basis van welke eigenschap wil je de objecten vergelijken? Kan op een property of op de hash. Voorbeeldje:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
<?php
function array_udiff_callback($a, $b) {
    return spl_object_hash($a) === spl_object_hash($b);
}


// of als je bijvoorbeeld op de eigenschap id wilt zoeken
function array_udiff_callback($a, $b) {
   return $a->id === $b->id;
}


// en dan
$uniek = array_udiff($oud1, $oud2, 'array_udiff_callback');
?>
 
Twan van der Poel

Twan van der Poel

16/03/2008 14:23:00
Quote Anchor link
Dag jelmer, ten eerste bedankt voor je reactie.

Ik heb een array met objecten erin die vergelijkt moeten worden op de eigenschap soort in combinatie met waarde.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
$object
->soort === $object2->soort && $object->waarde === $object2->waarde
?>


En de functie dient alleen de verschillen als array te retourneren, welke anpak is het verstandigst en waarom ?

Twan
 
Jelmer rrrr

Jelmer rrrr

16/03/2008 14:34:00
Quote Anchor link
Ik denk deze:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
<?php
function array_udiff_callback($a, $b) {
   return $a->soort == $b->soort && $a->waarde == $b->waarde;
}


array_udiff($array1, $array2, 'array_udiff_callback');
?>


De functie array_udiff zal alle items in de array met elkaar vergelijken op basis van de functie. Voor alle (nog bestaande) mogelijke combinaties wordt de functie array_udiff_callback aangeroepen (laatste argument van array_udiff) Wanneer deze callback 'true' teruggeeft komen de objecten overeen, en wordt er dus 1 weggedaan. Ik weet niet precies hoe het intern werkt, en in welke volgorden ze worden vergeleken.

Overigens, als het om private of protected eigenschappen gaat, dan kan je gebruik maken van een static method van de klasse van de objecten. Deze heeft immers wel toegang tot de protected/private properties:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
<?php
class Object {
   static public function compare($a, $b) {
      return $a->soort == $b->soort && $a->waarde == $b->waarde;
   }


   protected
      $soort,
      $waarde;
}


$arrayDiff = array_udiff($array1, $array2, array('Object', 'compare'));
?>
 
Twan van der Poel

Twan van der Poel

16/03/2008 16:02:00
Quote Anchor link
He Jelmer,

duidelijk verhaal.
Bedankt voor je asistentie,

twan
 



Overzicht Reageren