[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Оптимизация кода
KaFe
Цель кода проверить есть ли в строке через запятую одинаковые значения без учета регистра

$str=explode(",",strtolower($value));$count=count($str);
for ($x=0;$x<$count;$x++)
{
$len=strlen($str[$x]);
if (($len>255) || (!$len)) return 1;
}
for ($x=0;$x<$count;$x++)
{
for ($n=0;$n<$count;$n++)
{
if ($m!=$n) {if ($str[$m]==$str[$n]) return 1;}
}
}

Возможно ли как нибудь еще проще сделать??



Спустя 18 минут, 44 секунды (11.07.2010 - 21:15) KaFe написал(а):
$str=explode(",",strtolower($value));$count=count($str);
for ($x=0;$x<$count;$x++)
{
$str1=$str;
unset($str1[$x]);$len=strlen($str[$x]);
if (($len>255) || (!$len)) return 1; else
if
(in_array($str[$x],$str1)) return 1;
}

И больше я ничего не могу

Спустя 4 минуты, 58 секунд (11.07.2010 - 21:20) twin написал(а):
strtolower
это одинаковые?
PS ай(((

Спустя 2 минуты, 18 секунд (11.07.2010 - 21:23) KaFe написал(а):
Цитата (twin @ 11.07.2010 - 18:20)
strtolower
это одинаковые?
в каком смысле?strtolower нужно что бы все значения можно было сравнивать без учета регистра

Спустя 6 минут, 56 секунд (11.07.2010 - 21:29) twin написал(а):
ага, я успел "ай" написать. на самом деле наверняка можно проще решить. такая куча циклов чет не вдохновляет. завтра попробуем. )))

Спустя 7 минут, 7 секунд (11.07.2010 - 21:37) Ice написал(а):
у меня вот так получилось

<?php
$value = "hello, World, world";
$str=explode(", ", strtolower($value));
if( count( array_intersect( array_unique( $str ), $str ) ) == count( $str ) ) {
print 'В массиве нет повторяющихся значений!';
} else {
print 'В массиве есть повторяющиеся значения!';
}
?>

Спустя 5 минут, 35 секунд (11.07.2010 - 21:42) KaFe написал(а):
Ice все хорошо, мне твой вариант нравится,но ты не учел что каждое значение не должно быть больше 255 знаков, также значение не могут быть пустыми и должны содержать символы a-zA-Z0-9

Спустя 14 минут, 52 секунды (11.07.2010 - 21:57) Ice написал(а):
Так как-нибудь:

$value = "hello, World, world";
$str = explode( ", ", strtolower( $value ) );
while( list( $k, $v ) = each( $str ) ) {
if( ! preg_match('/^[a-z0-9]{0,255}$/iu', $v ) ) {
unset($str[$k]);
}
}

if( count( array_intersect( array_unique($str), $str ) ) == count( $str ) ) {
print 'В массиве нет повторяющихся значений!';
} else {
print 'В массиве есть повторяющиеся значения!';
}

Спустя 19 минут, 36 секунд (11.07.2010 - 22:17) KaFe написал(а):
Ice Он не работает как надо sad.gif

Спустя 31 секунда (11.07.2010 - 22:17) Ice написал(а):
что не так-то?

Спустя 39 минут, 45 секунд (11.07.2010 - 22:57) KaFe написал(а):
вот ваш видоизмененный код

$value = "hello,hell,fdsss";
$str = explode( ",", strtolower($value) );
while( list( $k, $v ) = each( $str ) ) {
if( ! preg_match('/^[a-z0-9]{0,255}$/iu', $v ) ) die('Строка не проходит');
}
if( count( array_intersect( array_unique($str), $str ) ) != count( $str ) ) die('Строка не проходит');
die('Строка проходит');


так все отлично работает, но если же мы зададим
$value = "s,,ss,sad";

то результат будет
Цитата
Строка проходит
а должно быть наооброт

P.S: Пробелов не должно быть вообще нигде.

Спустя 33 минуты, 23 секунды (11.07.2010 - 23:30) Ice написал(а):

$value = "hello,World,,world";
$str=explode(",", strtolower($value)); // Внимание из разделителя исчез пробел!
while( list( $k, $v ) = each( $str ) ) {
// в каждом значении массива должен быть хотя б один символ
if( ! preg_match('/^[a-z0-9]{1,255}$/i', $v)) {
unset($str[$k]);
}
}

if( count(array_intersect(
array_unique($str), $str ) ) == count( $str ) ) {
print 'В массиве нет повторяющихся значений!';
} else {
print 'В массиве есть повторяющиеся значения!';
}

В итоговом обработанном массиве пустой строки уже нет.

Спустя 14 минут, 50 секунд (11.07.2010 - 23:45) KaFe написал(а):
wink.gif Вот сейчас все работает.

Спустя 9 минут, 53 секунды (11.07.2010 - 23:55) Ice написал(а):
Ну, вот и славно smile.gif

Спустя 3 минуты, 16 секунд (11.07.2010 - 23:58) KaFe написал(а):
Замеры показали, что твой код
10000 обращений обрабатывает за
Цитата
0.376 сек.

а мой
Цитата
0.199 сек.


Ты не оптимизировал код, а увеличил использование оперативы в 2 раза. Жду новых идей...........

Спустя 2 минуты, 1 секунда (12.07.2010 - 00:00) Ice написал(а):

<?php
$value = "hello,World,world";
$str=explode(",", strtolower($value));
foreach( $str as $k=>$v ) {
if( ! preg_match('/^[a-z0-9]{1,255}$/i', $v)) {
unset($str[$k]);
}
}

if( count(array_intersect( array_unique($str), $str ) ) == count( $str ) ) {
print 'В массиве нет повторяющихся значений!';
} else {
print 'В массиве есть повторяющиеся значения!';
}
?>

а вот так?

Спустя 3 минуты, 12 секунд (12.07.2010 - 00:03) KaFe написал(а):
прогресс на лицо,0.277 сек. Работа с массивом занимает около 0.1 сек.

Спустя 28 минут, 43 секунды (12.07.2010 - 00:32) Ice написал(а):
убираем strtolower из explode. Он нам уже не нужен, потому что регулярка есть.

Спустя 9 минут, 21 секунда (12.07.2010 - 00:42) KaFe написал(а):
сегодня днем посмотрю, а сейчас пора кровать душить.

Спустя 8 часов, 14 минут, 51 секунда (12.07.2010 - 08:56) ApuktaChehov написал(а):
Вот, я сделал код, который работает 10000 раз за 0.133 без вывода данных в браузер:
$value = 'hello,World,world';
$arr = explode(',', strtolower($value));

foreach($arr as $val)
{
preg_match_all('/(?:'.$val.'){1,255}/iu', $value, $new_arr);
if( count($new_arr[0]) > 1 )
echo('Найдено '.count($new_arr[0]).' повторов значения:' .$val.'<br>');
}

Спустя 1 час, 33 минуты, 59 секунд (12.07.2010 - 10:30) KaFe написал(а):
ApuktaChehov извини за дерзость laugh.gif но твой код не люлю

Спустя 11 минут, 12 секунд (12.07.2010 - 10:42) ApuktaChehov написал(а):
В смысле?

Спустя 56 минут, 57 секунд (12.07.2010 - 11:39) KaFe написал(а):
не работает как нужно, ну смотрите какие должны быть условия для кода
  • все значения в строке должны быть только разделены запятыми
  • значения не должны повторяться
  • не должно быть пустых значений
  • значения должны состоять из латинских букв и цифр
  • значение не должно быть больше 255 символов
мы с Ice добились, соответствия этим условиям. На данный момент самый оптимизированный код находится во втором посте

Результатом должно быть проходит ли строка по данным условиям или нет

Спустя 25 минут, 19 секунд (12.07.2010 - 12:04) ApuktaChehov написал(а):
А, ну простите тогда, в прочитал первый пост и сделал, а там цель указана:
Цель кода проверить есть ли в строке через запятую одинаковые значения без учета регистра

Спустя 5 минут (12.07.2010 - 12:09) KaFe написал(а):
Цитата (ApuktaChehov @ 12.07.2010 - 09:04)
А, ну простите тогда, в прочитал первый пост и сделал, а там цель указана:

прощаю. wink.gif Ведь я по большей степени лажанулся чем вы, на да ладно. Проехали. Жду еще вариантов ...

Спустя 6 дней, 5 часов, 24 минуты, 33 секунды (18.07.2010 - 17:33) gzim9x написал(а):
Цитата (KaFe @ 11.07.2010 - 21:15)
$str=explode(",",strtolower($value));$count=count($str);
for ($x=0;$x<$count;$x++)
{
$str1=$str;
unset($str1[$x]);$len=strlen($str[$x]);
if (($len>255) || (!$len)) return 1; else
  if
(in_array($str[$x],$str1)) return 1;
}

И больше я ничего не могу


немного изменил...
function compareStr($string) {
$arr=explode(",",strtolower($string));
for ($i=0,$count=count($arr);$i<$count;$i++) {
if (!isset($arr[$i][0]) || isset($arr[$i][255]))
return 1;
$s=$arr[$i];
unset($arr[$i]);
if (in_array($s,$arr))
return 1;
}
return 0;
}

Спустя 2 часа, 32 минуты, 21 секунда (18.07.2010 - 20:06) KaFe написал(а):
gzim9x я вообще не понимаю ваш код blink.gif .

Спустя 1 час, 1 минута, 14 секунд (18.07.2010 - 21:07) Nikitian написал(а):
gzim9x
Вы в заголовке вроде бы ";" перепутали с "," - так говорит мой внутренний препроцессор =)

Спустя 4 часа, 37 минут, 35 секунд (19.07.2010 - 01:45) gzim9x написал(а):
Цитата (Nikitian @ 18.07.2010 - 21:07)
Вы в заголовке вроде бы ";" перепутали с "," - так говорит мой внутренний препроцессор =)

если вы о "for" -- то все верно написано

Спустя 13 минут, 10 секунд (19.07.2010 - 01:58) gzim9x написал(а):
Цитата (KaFe @ 18.07.2010 - 20:06)
gzim9x я вообще не понимаю ваш код blink.gif .

отличия от вашего кода только в 2 вещах:
1. вместо srtlen() на проверку размера строки используется конструкция isset для проверки есть ли в строке символы с индексом 255 (256 символ), или она пустая - нет символа с индексом 0 -- так быстрее.
2. вместо копирования массивов поиск дубля осуществляется в этом же массиве (с предварительным удалением искомой строки по индексу -- иначе in_array всегда будет true).

Спустя 5 часов, 45 минут, 10 секунд (19.07.2010 - 07:43) KaFe написал(а):
gzim9x хм, не знаю не знаю, как то все уж сложно для моего маленького мозга laugh.gif
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.