webForumDet fria alternativet
Logga in / Bli medlem

Sortera array i klass

PHP

2 svar · 501 visningar · startad av learn

Medlem sedan jan. 20051 130 inlägg
Frågan#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?

Medlem 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?

Medlem 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!

258 ms totalt · 4 externa anrop · v20260731065814-full.fc66e30b
120 ms — deklarationer (db)
0 ms — hämta statistik (cache)
135 ms — hämta tråd, inlägg och bilagor (db)
118 ms — ändringar (db)