GD громоздкий код

Sulik

Новичок
Есть такой код:
PHP:
if ($_GET[action] == "window") {

	header("Content-type: image/png");

	$col = count($_GET[type]);
	$im = imagecreate(75*$col+11, 150);

	$white = imagecolorallocate($im, 255, 255, 255);
	$black = imagecolorallocate($im, 0, 0, 0);
	$silver = imagecolorallocate($im, 245, 245, 245);
	$blue = imagecolorallocate($im, 190, 220, 220);	

	function glass($im, $start, $type, $black, $blue) {
		imagerectangle( $im, $start, 10, $start+65, 140, $black);
		imagefill($im, $start+1, 11, $blue);		
		if (stristr($type, "P")) {
			imageline($im, $start, 10, 65+$start, 75, $black);
			imageline($im, $start, 140, 65+$start, 75, $black);
		}
		if (stristr($type, "O")) {
			imageline($im, $start, 140, 32+$start, 10, $black);
			imageline($im, $start+65, 140, $start+33, 10, $black);
		}
	}
	
	imagerectangle( $im, 0, 0, 11+75*$col-1, 149, $black);
	imagefill($im, 1, 1, $silver);


	for ($i=0; $i<$col; $i++) {
		glass($im, 10+$i*75, $_GET[type][$i], $black, $blue);
	}

	imagepng($im);
	imagedestroy($im);
}
что бы долго не объяснять что он делать примерно такой запрос:
?action=window&type[]=PO&type[]=P&type[]=O&type[]=
Впринципе всё работает но как то уж громоздко получилось есть предложения как это исправить.
 

SiZE

Новичок
Спасибо. еще вопрос почемсу так неправильно:
if (!$_GET['m'])
Правильно если у тебя есть ключ m в массиве $_GET. Восклицательный знак можно приравнять к такому выражению $_GET['m'] == FALSE. Лучше так: if ( isset( $_GET['m'] ) ) { ... }.
 

Sulik

Новичок
Всё понятно. ну а по коду что
Правильно если у тебя есть ключ m в массиве $_GET. Восклицательный знак можно приравнять к такому выражению $_GET['m'] == FALSE. Лучше так: if ( isset( $_GET['m'] ) ) { ... }.
Всё понятно. ну а по коду что скажешь. всё ужасно?
 

SiZE

Новичок
Всё понятно. ну а по коду что
Всё понятно. ну а по коду что скажешь. всё ужасно?
Обычный процедурный код. :) Добавить комментарии к функции, некоторым действиям. И еще я лично предпочитаю в заголовках использовать:
PHP:
error_reporting( E_ALL );
ini_set('display_errors', 1);
что бы все ошибки отловить.

Из пары не критичных моментов: 1. sizeof вместо count. 2. В твоем случае вместо if (stristr($type, "P")) используй if ( stripos( $type, 'p' ) !== FALSE )
 

Sulik

Новичок
В твоем случае вместо if (stristr($type, "P")) используй if ( stripos( $type, 'p' ) !== FALSE )
А в чем разница? в описании функции stristr она вернет FALSE при отсутствии 'P'. это мне и нужно.
Насколько я понял stristr возвращает строку а stripos позицию. и ты мне это советуешь для того чтобы расходовать меньше памяти сервера?
 

SiZE

Новичок
А в чем разница? в описании функции stristr она вернет FALSE при отсутствии 'P'. это мне и нужно.
Насколько я понял stristr возвращает строку а stripos позицию. и ты мне это советуешь для того чтобы расходовать меньше памяти сервера?
Разница в возвращаемых результатах. И то и другое может вернуть FALSE. Последнее быстрее и расходует меньше памяти.
 

Sulik

Новичок
Разница в возвращаемых результатах. И то и другое может вернуть FALSE. Последнее быстрее и расходует меньше памяти.
не знаю как в ПХП но думаю тут как и в C++ char и int занимают одинаковый объем памяти. соответственно в моем случае это абсолютно не будет иметь не какой разницы, а в общем если бы я передавал функции значения больше чем 1-2 символа то нужно использовать stripos или я не правильно чтото понимаю?
 

Sulik

Новичок
а пол скорости разве эти функции работают не одинакова по байтово, перебирая до нахождения нужного символа и вернув значения. мне кажется это уже выбор программиста
 

tz-lom

Продвинутый новичок
Sulik
ну раз СИ знаете залезте в код и убедитесь что таки по разному,оно в принципе и так понятно потому что strstr не только ищет подстроку,но потом ещё и копирует остаток
 

Sulik

Новичок
Sulik
ну раз СИ знаете залезте в код и убедитесь что таки по разному,оно в принципе и так понятно потому что strstr не только ищет подстроку,но потом ещё и копирует остаток
а я говорю что как раз в моем случае это уже выбор программист.а ОСТАТКА не будет. я отправляю 1 или максимум два символа. в общем почитав за обе функции я согласен с SiZE. но как раз не моем случае. просто он говорил что в моем случае лучше использовать strpos. если бы я отправил '123747889' и искал там 4 тогда конечно. мне просто всё интересно про всё я только три дня назад начал пробовать учить пхп. поэтому задаю много вопросов возможно глупых.
 

Sulik

Новичок
Sulik
ну раз СИ знаете залезте в код и убедитесь что таки по разному,оно в принципе и так понятно потому что strstr не только ищет подстроку,но потом ещё и копирует остаток
а я говорю что как раз в моем случае это уже выбор программист.а ОСТАТКА не будет. я отправляю 1 или максимум два символа. в общем почитав за обе функции я согласен с SiZE. но как раз не моем случае. просто он говорил что в моем случае лучше использовать strpos. если бы я отправил '123747889' и искал там 4 тогда конечно. мне просто всё интересно про всё я только три дня назад начал пробовать учить пхп. поэтому задаю много вопросов возможно глупых.
 

tz-lom

Продвинутый новичок
Sulik
на самом деле время аллокации любой строки значительно превышает время её заполнения
 

Sulik

Новичок
Sulik
ну раз СИ знаете залезте в код и убедитесь что таки по разному,оно в принципе и так понятно потому что strstr не только ищет подстроку,но потом ещё и копирует остаток
все равно думаю что как раз в моем случае это уже выбор программист. ОСТАТКА не будет. я отправляю 1 или максимум два символа. в общем почитав за обе функции я согласен с SiZE. но как раз не моем случае. просто он говорил что в моем случае лучше использовать strpos. если бы я отправил '123747889' и искал там 4 тогда конечно.
мне просто всё интересно про всё я только три дня назад начал пробовать учить пхп. поэтому задаю много вопросов возможно глупых.
 

skryisli

Новичок
Sulic написал(а):
просто он говорил что в моем случае лучше использовать strpos
У пхп есть одна хорошая особенность, весьма вредная в случае со strpos: в любом условии он считает труем всё что не фэлс, не ноль, и не пустая строка. Когда стрпоз найдёт 4 в строке "456789", он выдаст ноль. Позицию символа в строке. И в любом условном операторе это будет не тру. На этом можно хорошо затормозиться.
 
Сверху