webForumDet fria alternativet

Sortera array i klass

2 svar · 501 visningar · startad av learn

learnMedlem sedan jan. 20051 130 inlägg
#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?

learnMedlem sedan jan. 20051 130 inlägg
#2

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?

dreasMedlem sedan jan. 2004140 inlägg
#3

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!

128 ms totalt · 3 externa anrop · v20260731065814-full.30151723
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
125 ms — hämta tråd, inlägg och bilagor (db)