[OOP] Objecten sorteren met usort (variable scope probleempje)
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])
([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';
}
}
/**
* 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;
}
* 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; }
{
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!!!!!
Code (php)
1
2
3
4
5
6
7
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...
}
}
?>
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
mja, dat was ook mijn eerste gedachte, maar omdat sortDESC een callback van usort is, accepteerd hij alleen maar 2 parameters