[OOP] Objecten sorteren met usort (variable scope probleempje)

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Van der

van der

10/05/2011 14:16:54
Quote Anchor link
Dag mijner heren/dames

Ik stuit op een horde waar ik even niet uit kom.

Ik heb in een array een lijst met objecten. Sow dus:
Quote:
$objects_array
([key] = > [object])


In mijn framework kan deze array verschillende soorten objecten bevatten, maar altijd 1 en dezelfde soort.

Omdat mijn mijn classen een gemeenschappelijk ontwerp delen (datums, numerieke info etc.) wil ik een algemene functie schrijven voor het sorteren van mijn $objects_array op waarden in mijn object. Niet zo moeilijk zou je zeggen, maar nu komt de grap: de objecten hebben public arrays met daarin alle info van het desbetreffende object.

Klinkt misschien een beetje complex maar een voorbeeldje:

Quote:

/**
* Contains information about a city
**/
class city
{
public $cityinfo = array();

public function __construct()
{
$this->cityinfo['name_el'] = 'somewhere';
}
}

/**
* Informatie over een stad
**/
class stad
{
public $stadinfo = array();

public function __construct()
{
$this->stadinfo['name_en'] = 'ergens';
}
}



Goed, nu dacht ik dus mooi even een usort functie te schrijven die de array bij langs gaat, met als parameters de naam van de array, en de key waar je op kunt sorteren. Zie hieronder:

Quote:
/**
* Sort an array of objects by a key in one of the object`s arrays
* @param array $object_array Array of objects by [] => object
* @param string $array Name of the array containing the sort key
* @param string $key Name of the key
* @param string $sort Sort the list ascending or descending (default ASC)
* @return array containing the sorted objects
*/
function acid_sortObjectsByArrayKeys($object_array, $array, $key, $sort = 'ASC')
{
function sortDESC ($a, $b)
{
if ($a->$array[$key] == $b->$array[$key])
{ return 0; }

return ($a->$array[$key] > $b->$array[$key]) ? -1 : 1;
}
function sortASC ($a, $b)
{
if ($a->$array[$key] == $b->$array[$key])
{ return 0; }

return ($a->$array[$key] > $b->$array[$key]) ? 1 : -1;
}

if($sort == 'ASC')
{
usort($object_array, "sortASC");
}
elseif($sort == 'DESC')
{
usort($object_array, "sortDESC");
}

return $object_array;
}



Hopelijk is het zo een beetje duidelijk wat ik wil doen.

Na mijn $objects_array gevult te hebben met objecten wil ik het volgende doen:

$objects_array = acid_sortObjectsByArrayKeys($objects_array, "siteinfo", "name_nl");
of
$objects_array = acid_sortObjectsByArrayKeys($objects_array, "cityinfo", "name_en");


het is een beetje een beknopte omschijving snap ik, maar neem maar van mij aan dat het ontwerp zuiver is.

Ik heb nu het volgende probleem:

op de laatste regel van dit stuukje code:

Quote:
function acid_sortObjectsByArrayKeys($object_array, $array, $key, $sort = 'ASC')
{
function sortDESC ($a, $b)
{
if ($a->$array[$key] == $b->$array[$key])
{ return 0; }


zijn $array en $key niet zichbaar. Ik heb verschillende opties geprobeert zoals ze global maken, maar gezien mijn redelijk strakke class definities doe ik dat natuurlijk liever niet.

Mijn vraag

( drumm roll please.... )

Hoe zorg ik ervoor dat mijn $key en $array variabelen zichtbaar zijn in de sub-functie?


hulp word zeer gewaardeerd!!!!!
 
PHP hulp

PHP hulp

23/11/2024 16:30:13
 
Joren de Wit

Joren de Wit

10/05/2011 14:30:58
Quote Anchor link
Eigenlijk een heel simpel antwoord: $array en $key meegeven als parameters aan de subfunctie:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
<?php
function acid_sortObjectsByArrayKeys($object_array, $array, $key, $sort = 'ASC') {
  function
sortDESC($a, $b, $array = $array, $key = $key) {
    // Doe je ding...
  }
}

?>

Volgens mij moet dit werken?
Gewijzigd op 10/05/2011 14:31:32 door Joren de Wit
 
Van der

van der

10/05/2011 16:15:38
Quote Anchor link
mja, dat was ook mijn eerste gedachte, maar omdat sortDESC een callback van usort is, accepteerd hij alleen maar 2 parameters
 
Jelmer -

Jelmer -

10/05/2011 19:48:32
Quote Anchor link
Als je een method van een object meegeeft kan je de scope van het object, $this, gebruiken om extra variabelen bij de aanroep te hebben:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?php

class KeyComparator
{
    private $key;

    public function __construct($key)
    {

        $this->key = $key;
    }


    public function compare($left, $right)
    {

        return $left[$this->key] > $right[$this->key] ? 1 : -1;
    }
}


$comparator = new KeyComparator('surname');
usort($users, $comparator);
?>
Gewijzigd op 10/05/2011 19:49:20 door Jelmer -
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.