L learn Medlem sedan jan. 2005 1 130 inlägg Frågan 25 aug. 2008 14:59 #1 Jag lyckas inte sortera min array i en klass:
class Table
{
private $data;
private $order_by;
public function __construct($data)
{
$this->data = $data;
}
public function set_order($order_by)
{
$this->order_by = $order_by;
// Sorts an array
function sort_array($a, $b)
{
$x = $a[$this->order_by];
$y = $b[$this->order_by];
if ( is_int($x) || is_float($x) )
{
return $x - $y;
}
else
{
return strcmp($x, $y);
}
}
// Sort data array
usort($this->data, "sort_array");
}
}
Arrayen $data ser ut enligt följande:
Array
(
[0] => Array
(
[id] => 1
[username] => test
[pass] => hejhej
)
[1] => Array
(
[id] => 2
[username] => test2
[pass] => lalala
)
[2] => Array
(
[id] => 3
[username] => test3
[pass] => hehehe
)
)
Jag vill alltså kunna sortera den genom att skriva tex:
$users_table = new Table($data);
$users_table->set_order("username");
Med ovanstående kod får jag detta:
Fatal error: Using $this when not in object context in C:\...
Hur ska jag göra istället?
L learn Medlem sedan jan. 2005 1 130 inlägg Ah...
Hittade denna:
function msort($array, $order_by)
{
$temp_array = array();
while(count($array)>0)
{
$lowest_id = 0;
$index=0;
foreach ($array as $item)
{
if (isset($item[$order_by]) && $array[$lowest_id][$order_by])
{
if ($item[$order_by]<$array[$lowest_id][$order_by])
{
$lowest_id = $index;
}
}
$index++;
}
$temp_array[] = $array[$lowest_id];
$array = array_merge(array_slice($array, 0,$lowest_id), array_slice($array, $lowest_id+1));
}
return $temp_array;
}
Funkar klockrent!
Några invändningar/förbättringstips?
D dreas Medlem sedan jan. 2004 140 inlägg Hej,
Dammar av en gammal tråd då denna funktion kom till nytta för min del. Jag gjorde dock några enkla förändringar som gör att man kan välja ifall det ska vara DESC eller ASC sortering:
function msort($array, $order_by, $sort_by) {
$temp_array = array();
while(count($array)>0)
{
$lowest_id = 0;
$index=0;
foreach ($array as $item)
{
if (isset($item[$order_by]) && $array[$lowest_id][$order_by])
{
if ($item[$order_by]<$array[$lowest_id][$order_by] && $sort_by=='DESC')
{
$lowest_id = $index;
}
if ($item[$order_by]>$array[$lowest_id][$order_by] && $sort_by=='ASC') {
$lowest_id = $index;
}
}
$index++;
}
$temp_array[] = $array[$lowest_id];
$array = array_merge(array_slice($array, 0,$lowest_id), array_slice($array, $lowest_id+1));
}
return $temp_array;
}
Vilket man sedan anropar exempelvis med följande
$Class->msort($array, 'Kolumn', 'ASC');
Inget fancy, men förhoppningsvis kommer det till nytta för någon!