Sortowanie tablicy


(1q2w3e4r) #1
$tablica = 

Array

(

    [http] => Array

        (

            [server] => [url="http://serwer1.pl"]http://serwer1.pl[/url]

            [load] => 0.20

            [memory_free] => 1893

            [memory_usage] => 154

            [cpu%_usage] => 2

        )


    [http] => Array

        (

            [server] => [url="http://serwer2.pl"]http://serwer2.pl[/url]

            [load] => 0.44

            [memory_free] => 1925

            [memory_usage] => 122

            [cpu%_usage] => 0

        )


    [http] => Array

        (

            [server] => [url="http://serwer3.pl"]http://serwer3.pl[/url]

            [load] => 0.00

            [memory_free] => 1444

            [memory_usage] => 180

            [cpu%_usage] => 43

        )


)

Podaję przykładową tablice, którą chce posortować.

Chodzi o to że musze wybrać serwer, który jest w danej chwili najmniej obciążony i wyświetlić jego dane na ekran.

Najpierw wybieramy serwer, który ma najmniej obciążone wszystkie elementy i który nie przekracza load < 1.50, memory_free < 1700, cpu%_usage < 80

Jeśli jest kilka takich serwerów, które nie przekraczają tych granic wybieramy z nich serwer (klucz tablicy), który ma najmniej obciążony ram (memory_free), a nastepnie load.

Jeśli wszystkie serwery przekroczyły load < 1.50, memory_free < 1700, cpu%_usage < 80 to również sprawdzamy który ma najmniej obciążony ram oraz load i ten serwer wybieramy.

Dodam, że nie wiem ile będzie tych serwerów w danej chwili. Dlatego trzeba liczyć ile ich jest, a nie na sztywno wypisać bo tak to można później zrobić funkcja min();

Zaczynam w php i nie wiem jak to posortować wszystko aby dobrze działało.

-- Dodane 30.08.2011 (Wt) 23:17 --

nikt mi nie pomoże ?


(mario@) #2

http://4programmers.net/PHP/Tablice_w_PHP - całość ogranicza się do napisania odpowiednich warunków.


(1q2w3e4r) #3

Na aktualny poziom, na którym się znajduje w php to zrobiłem taki skrypt, który wybiera najbardziej obciążony serwer. Wykorzystałem znane mi funkcje.

Byłbym wdzięczny za jakaś lepszą wersje tego.

// testowe tablice

		$servers2[] = array('server' => 'http://jakistestowy2.pl', 'load' => '1.66', 'upload' => '60.31', 'download' => '90.50', 'memory_free' => '1300', 'memory_usage' => '700', 'cpu%_usage' => '40');

		$servers2[] = array('server' => 'http://jakistestowy.pl', 'load' => '0.44', 'upload' => '20.01', 'download' => '30.00', 'memory_free' => '1700', 'memory_usage' => '300', 'cpu%_usage' => '16');


		$servers2[] = array('server' => 'http://jakistestowy3.pl', 'load' => '0.78', 'upload' => '100.00', 'download' => '70.65', 'memory_free' => '1000', 'memory_usage' => '1000', 'cpu%_usage' => '60');


		$servers = $servers2;


		echo 'Przykładowe serwery: 
';

		print_r($servers);


		echo '

';


		// liczymy ile jest serwerów

		$ile_serwerow = count(array_keys($servers));


		// definiujemy tablice

		$tablica_load = array();

		$tablica_upload = array();

		$tablica_download = array();

		$tablica_memory_free = array();

		$tablica_memory_usage = array();

		$tablica_cpu_usage = array();


		// tworzymy tablice parametrów

		for ($i=0; $i<$ile_serwerow;$i++) 

		{

			$tablica_load[$servers[$i]['server']] = $servers[$i]['load'];

			$tablica_upload[$servers[$i]['server']] = $servers[$i]['upload'];

			$tablica_download[$servers[$i]['server']] = $servers[$i]['download'];

			$tablica_memory_free[$servers[$i]['server']] = $servers[$i]['memory_free'];

			$tablica_memory_usage[$servers[$i]['server']] = $servers[$i]['memory_usage'];

			$tablica_cpu_usage[$servers[$i]['server']] = $servers[$i]['cpu%_usage'];

		}

		echo 'Wyświetlamy tablice parametrów: 
';

		print_r($tablica_load);

		echo '
';

		print_r($tablica_upload);

		echo '
';

		print_r($tablica_download);

		echo '
';

		print_r($tablica_memory_free);

		echo '
';

		print_r($tablica_memory_usage);

		echo '
';

		print_r($tablica_cpu_usage);

		echo '



';



		// wybieramy serwery, które nie przekraczają określonych wartości

		$tablica_load2= array();

		foreach($tablica_load as $klucz_load => $wartosc_load) 

		{

			if($wartosc_load < '1.50')

			{

				$tablica_load2[$klucz_load] = $wartosc_load;

			}

		}


		$tablica_upload2= array();

		foreach($tablica_upload as $klucz_upload => $wartosc_upload) 

		{

			if($wartosc_upload < '95.00')

			{

				$tablica_upload2[$klucz_upload] = $wartosc_upload;

			}

		}


		$tablica_download2= array();

		foreach($tablica_download as $klucz_download => $wartosc_download) 

		{

			if($wartosc_download < '90.00')

			{

				$tablica_download2[$klucz_download] = $wartosc_download;

			}

		}


		$tablica_memory_free2= array();

		foreach($tablica_memory_free as $klucz_memory_free => $wartosc_memory_free) 

		{

			if($wartosc_memory_free > '100.00')

			{

				$tablica_memory_free2[$klucz_memory_free] = $wartosc_memory_free;

			}

		}


		$tablica_memory_usage2= array();

		foreach($tablica_memory_usage as $klucz_memory_usage => $wartosc_memory_usage) 

		{

			if($wartosc_memory_usage < '1900.00')

			{

				$tablica_memory_usage2[$klucz_memory_usage] = $wartosc_memory_usage;

			}

		}


		$tablica_cpu_usage2= array();

		foreach($tablica_cpu_usage as $klucz_cpu_usage => $wartosc_cpu_usage) 

		{

			if($wartosc_cpu_usage < '90.00')

			{

				$tablica_cpu_usage2[$klucz_cpu_usage] = $wartosc_cpu_usage;

			}

		}


		unset($tablica_load);

		unset($tablica_upload);

		unset($tablica_download);

		unset($tablica_memory_free);

		unset($tablica_memory_usage);

		unset($tablica_cpu_usage);


		echo 'Serwery, które nie przekraczają określonych wartości: 
';

		print_r($tablica_load2);

		echo '
';

		print_r($tablica_upload2);

		echo '
';

		print_r($tablica_download2);

		echo '
';

		print_r($tablica_memory_free2);

		echo '
';

		print_r($tablica_memory_usage2);

		echo '
';

		print_r($tablica_cpu_usage2);

		echo '



';



		// wybieramy najmniejsze wartości z tych serwerów które nie przekroczyły wartości maksymalnych

 		// od najmniejszej do największej

		function cmp($a, $b) 

		{

			if ($a == $b) 

			{

					return 0;

			}

			return ($a < $b) ? -1 : 1;

		}

		// od największej do najmniejszej

 		function cmp2($a, $b) 

		{

			if ($a == $b) 

			{

					return 0;

			}

			return ($a > $b) ? +1 : 1;

		}

		// najmniejsza wartość

		uasort($tablica_load2, 'cmp');

		uasort($tablica_upload2, 'cmp');

		uasort($tablica_download2, 'cmp');

		uasort($tablica_memory_free2, 'cmp2');

		uasort($tablica_memory_usage2, 'cmp');

		uasort($tablica_cpu_usage2, 'cmp');


		echo 'Serwery posortowane według najmniejszego obciażenia: 
';

		print_r($tablica_load2);

		echo '
';

		print_r($tablica_upload2);

		echo '
';

		print_r($tablica_download2);

		echo '
';

		print_r($tablica_memory_free2);

		echo '
';

		print_r($tablica_memory_usage2);

		echo '
';

		print_r($tablica_cpu_usage2);

		echo '



';



		// wybieranie wartości z najmniej obciazonych serwerów

		list ($klucz_load, $wartosc_load) = each ($tablica_load2);

		$serwer_load = $klucz_load;


		list ($klucz_uplaod, $wartosc_upload) = each ($tablica_upload2);

		$serwer_upload = $klucz_uplaod;


		list ($klucz_download, $wartosc_download) = each ($tablica_download2);

		$serwer_download = $klucz_download;


		list ($klucz_memory_free, $wartosc_memory_free) = each ($tablica_memory_free2);

		$serwer_memory_free = $klucz_memory_free;


		list ($klucz_memory_usage, $wartosc_memory_usage) = each ($tablica_memory_usage2);

		$serwer_memory_usage = $klucz_memory_usage;


		list ($klucz_cpu_usage, $wartosc_cpu_usage) = each ($tablica_cpu_usage2);

		$serwer_cpu_usage = $klucz_cpu_usage;



		// tablica najmniej obciążonych serwerów

		$tablica_najmniej_obciazone = array($serwer_load, $serwer_upload, $serwer_download, $serwer_memory_free, $serwer_memory_usage, $serwer_cpu_usage);


		echo 'Tablicza najmniej obciazonych serwerow: 
';

		print_r($tablica_najmniej_obciazone);

		echo '

';


		// zliczanie wystepowania

		$tablica_najczesciej_wystepuje = array_count_values($tablica_najmniej_obciazone);


				echo 'Najczesciej wystepujace: 
';

		print_r($tablica_najczesciej_wystepuje);


		// pobieranie 1 klucz

		list ($klucz_serwer, $wartosc_serwer) = each ($tablica_najczesciej_wystepuje);

		$serwer = $klucz_serwer;


		echo '
Wreszcie koniec. Ten serwer jest najmniej obciazony: '.$serwer.'';

[/code]

Wiem, że da się to zawrzeć o połowę mniej kodu ale cóż. Pierwsza wersja jest.


(mario@) #4

Dobrze ,że podałeś jak to sobie wyobrażasz bo myślałem, że chodzi o wybór serwera w pierwszej kolejności z największą liczbą przy memory_free a nie tego, który występuje najczęściej z podanych. Poniższy kod robi to co Twój ale zajmuje mniej linijek(przetestuj go dla rożnych wartości). Pominąłem w nim sprawdzanie load < 1.50, memory_free < 1700, cpu%_usage < 80 gdyż dla mnie jest to bez sensu bo i tak wybierasz najmniej obciążony serwer(oczywiście dość łatwo można to dodać do poniższego kodu).

// testowe tablice    $servers2[] = array('server' = 'http://jakistestowy2.pl', 'load' = '60', 'upload' = '10.31', 'download' = '10.50', 'memory_free' = '1300', 'memory_usage' = '900', 'cpu%_usage' = '40');    $servers2[] = array('server' = 'http://jakistestowy.pl', 'load' = '0.44', 'upload' = '20.01', 'download' = '30.00', 'memory_free' = '1700', 'memory_usage' = '300', 'cpu%_usage' = '16');       [] = array('server' = 'http://jakistestowy3.pl', 'load' = '0.78', 'upload' = '100.00', 'download' = '70.65', 'memory_free' = '1000', 'memory_usage' = '1000', 'cpu%_usage' = '60');

(1q2w3e4r) #5

Dzięki wielkie za pomoc.