многообразие подходов к решению простой задачи

гоша

Guest
ничего массив, красивый... ;-)

может, определимся, какая задача всё-таки решается.

1) установить что все элементы массива равны ""
2) установить что все элементы массива НЕ равны ""
3) дать число элементов, равных ""
4) дать число элементов, НЕ равных ""
 

Demiurg

Guest
на самом деле надо было узнатьт есть ли хоть один не пустой элемент.
 

Demiurg

Guest
su1d
на этом массиве быстрее, а вот на таком медленее:
$a = array("" , "" , "???????" , "" , "?" , "?" , "?" , "?" , "fasdfas" , "fadf" , "" , "a" , "" , "" , "" , "" , "" ,"" , "" , "" , "???????" , "?????" , "?fasfas" , "fasdfas" , "" , "a" , "" , "" , "" , "" , "" , "" , "" , "" ,"" , "" , "" , "" , "asdfsdfa" , "" , "" , "" , "" , "" , "" , "" , "" , "" , "" , "" , "" ,"?????" , "erqwerqwerqwerewrwerwef sdafas sdaf af afs" , "" , "" , "" , "" , "" , "" , "" , "" , "" , "" , "" , "" , "" , "" , "" ,"" , "" , "" , "" , "" , "" , "a" , " dsf adfasdf se ewfe wf" , "" , "" , " wer weew fewqf wef qfwfsdf wqe few" , "" , " ??? wefefwefhbfihwfewe " , "dsafasdf jkbewhefg iwef wf" , " fasf bsdf uhsdgfiaytewfvwf" , "fawelkjhsd fweg ?????????????" , "?????????????" ,"" , "?????????????????????" , "?????????????????????" );

:)

кстати, я не понял смысла конструкции
return (boolean expr)? true:false;
 

гоша

Guest
Demiurg

Скорость for как ты понимаешь, зависит от количества итераций. Т.е. если искомый элемент в самом конце массива, то будет плохо.

В то же время, array_count_values имеет постоянную скорость, и дает гораздо больше информации (т.е. мы решаем все четыре задачи сразу).

su1d

flip я мерял, он еще хуже чем count_values
 

Demiurg

Guest
гоша
нам не нужна дополнительная информация.
 

SA739

Cogito, ergo sum
по следам su1dа :)

PHP:
function is_empty(&$arr) {
	return (sizeof(array_flip($arr)) == 1)? true : false;
}
 

Demiurg

Guest
SA739
$a = array('a' , 'a');
что скажет твоя функция ?
 

SA739

Cogito, ergo sum
Demiurg
согласен, неучел...
проверку на пустой ключ полюбому нужно делать...
 

гоша

Guest
Demiurg

упрямый ты...

PHP:
function msec(){ 
   list($u,$s)=explode(" ",microtime()); 
   return (doubleval($u)+doubleval($s)); 
} 
function test($max_items,$where_item){
	$a=array_fill(0,$max_items,"");
	$a[$where_item]="x";
	
	printf("<pre>Item at $where_item from $max_items\n");
	
	$t=msec();
	$q=array_flip($a);
	if($q[""]!=count($a))print "FLIP: found ";
	printf("%f\n",msec()-$t);

	$t=msec();
	$q=array_count_values($a);
	if($q[""]!=count($a))print "CNT : found ";
	printf("%f\n",msec()-$t);
	
	$t=msec();
	foreach($a as $v)
		if($v!=""){print "FOR : found ";break;}
	printf("%f\n",msec()-$t);
}
test(3000,1); печатает:

Item at 1 from 3000
FLIP: found 0.001732
CNT : found 0.000600
FOR : found 0.000083

то есть все как бы в пользу цикла.

Запускаем test(3000,600), получаем

Item at 600 from 3000
FLIP: found 0.001836
CNT : found 0.000625
FOR : found 0.002042

отсюда мораль:

Лучше более медленные (в худшем случае), но стабильные результаты, чем линейное возрастание времени выполнения с увеличением объема данных.
 

SA739

Cogito, ergo sum
а если так:
PHP:
function is_empty(&$arr) {
	$tmpArr = array_count_values($arr);
	return ($tmpArr[''] == sizeof($arr))? true: false;
}
?
 

Demiurg

Guest
гоша
я же говорил, кто платит, тот и музыку заказывает :)
попробуй массив в котором не 2 значения.
 

гоша

Guest
> попробуй массив в котором не 2 значения.

нет, не хочу... ;)
неинтересно.
не такая это задачка, чтобы копья ломать.
 
Сверху