Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: не работает программа

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (2): [1] 2 »   

> Без описания
mr.Kravcoff
Отправлено: 06 Апреля, 2015 - 18:44:04
Post Id


Новичок


Покинул форум
Сообщений всего: 8
Дата рег-ции: Март 2015  


Помог: 0 раз(а)




<?php
function remove_numbers ($str){
$res='';
for ($i=0;$i<strlen($str);$i++) {
if ($str[$i]==0 ||$str[$i]==1||$str[$i]==2||$str[$i]==3||$str[$i]==4||$str[$i]==5||$str[$i]==6||
$str[$i]==7||$str[$i]==8||$str[$i]==9)
$res .= '';
else $res .= $str[$i];
}
echo $res;
}
remove_numbers ('t07i 98po6be85dil') ;

?>

по идее должны убираться числа из строки, но почему-то в браузере ничего не выводится, помогите, пожалуйста, разобраться
 
 Top
esterio
Отправлено: 06 Апреля, 2015 - 18:57:01
Post Id



Активный участник


Покинул форум
Сообщений всего: 5025
Дата рег-ции: Нояб. 2012  
Откуда: Украина, Львов


Помог: 127 раз(а)




1. Если кодировка UTF-8 то такой финт не прокатит
2. зачем так много условий если можно сделать хотябы так

но все равно такой подход неверен
верны решением являеться использование регулярок

либо так

(Отредактировано автором: 06 Апреля, 2015 - 18:57:51)

 
 Top
mr.Kravcoff
Отправлено: 06 Апреля, 2015 - 19:03:55
Post Id


Новичок


Покинул форум
Сообщений всего: 8
Дата рег-ции: Март 2015  


Помог: 0 раз(а)




а что такое регулярка?
(Добавление)
и почему именно не покатит финт?
 
 Top
esterio
Отправлено: 06 Апреля, 2015 - 21:38:25
Post Id



Активный участник


Покинул форум
Сообщений всего: 5025
Дата рег-ции: Нояб. 2012  
Откуда: Украина, Львов


Помог: 127 раз(а)




 
 Top
OrmaJever Модератор
Отправлено: 07 Апреля, 2015 - 13:00:48
Post Id



Активный участник


Покинул форум
Сообщений всего: 7540
Дата рег-ции: Янв. 2010  
Откуда: Чернигов


Помог: 299 раз(а)




esterio пишет:
1. Если кодировка UTF-8 то такой финт не прокатит

а почему не прокатит?
PHP:
скопировать код в буфер обмена
  1. $str = 'т5';
  2. echo strlen($str); // > 3
  3. echo $str[2]; // > 5

strlen показывает 3 что значит что "т" это 2 байта, а цифра всего 1. Обращение по индексу выводит корректно цифру.


-----
Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
 
 Top
LIME
Отправлено: 07 Апреля, 2015 - 13:07:04
Post Id


Активный участник


Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010  


Помог: 322 раз(а)




OrmaJever да
если учитывать что каждый кириллический символ это 2 байта - 2 индекса массива
а как разбить произвольную строку не зная заранее последовательности символов?
PHP:
скопировать код в буфер обмена
  1. $str = $_POST['str'];
  2. echo $str[2];// какой символ выведет? уверен что не сломанный? ты чет загнался)) кофе еще не пил?))

(Добавление)
хотя даже при разбиении по регулярке придется учитывать приведение типов к булевому
esterio пишет:
$str[$i] >= 0
подводный камень без явного приведения
 
 Top
MADONZY
Отправлено: 08 Апреля, 2015 - 11:20:27
Post Id


Гость


Покинул форум
Сообщений всего: 104
Дата рег-ции: Июнь 2013  


Помог: 0 раз(а)




Как сказал esterio лучшим и наиболее быстрым подходом будет:

Регулярка в данном случае совершенно не требуется и более того не рекомендуется.

OrmaJever, LIME, прокатит, но не так как вы это написал. Забыли о http://php.net/manual/en/ref.mbstring.php

LIME пишет:
хотя даже при разбиении по регулярке придется учитывать приведение типов к булевому

зачем? сейчас 21 век, preg_replace() использует PCRE, а значит доступен модификатор (regex pattern modifier) "u" который решит проблему.

(Отредактировано автором: 08 Апреля, 2015 - 11:21:20)

 
 Top
LIME
Отправлено: 08 Апреля, 2015 - 15:13:44
Post Id


Активный участник


Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010  


Помог: 322 раз(а)




MADONZY дурак тыУлыбка
Любой символ больше ноляУлыбка
(Добавление)
Ну тоесть любой не приводящийся к false
(Добавление)
MADONZY пишет:
более того не рекомендуется
кем?УлыбкаУлыбкаУлыбка
 
 Top
MADONZY
Отправлено: 08 Апреля, 2015 - 17:43:30
Post Id


Гость


Покинул форум
Сообщений всего: 104
Дата рег-ции: Июнь 2013  


Помог: 0 раз(а)




LIME пишет:
MADONZY дурак ты

сам ты дурак Улыбка
LIME пишет:
Любой символ больше ноля

да что ты говоришь))) Может в С да, но мы говорим о PHP.

LIME пишет:
Ну тоесть любой не приводящийся к false

ни один символ при сравненни с числом никогда не приведется к false. Преобразование будет в int, в данном случае в 0 (символы '1'-'9' будут преобразованы в свои целочисленные соответствия).
LIME пишет:
кем?

Мною Улыбка Использование регулярных выражений для такой банальной задачи... не смешите! Функция str_replace() на 61.56% более производительная чем preg_replace() (даже без учета регулярок). Ещё лучше использовать strtr() (она на 9.76% быстрее чем str_replace()), но в данном случае она к сожелению не подойдёт.
 
 Top
LIME
Отправлено: 08 Апреля, 2015 - 18:30:37
Post Id


Активный участник


Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010  


Помог: 322 раз(а)




MADONZY пишет:
сам ты дурак
эээм...не совсем))я может и не правильно выразился насчет
LIME пишет:
Любой символ больше ноля

но
esterio пишет:
$str[$i] >= 0

MADONZY пишет:
Функция str_replace() на 61.56% более производительная чем preg_replace()
совершенно не верно
вообще это сильно зависит от шаблона
в простейшем шаблоне они сильно сравнимы по скорости
MADONZY пишет:
Мною
ага)) помню я твои вопросы))
как-то не очень впечатляет твоя рекомендация)

(Отредактировано автором: 08 Апреля, 2015 - 18:32:07)

 
 Top
MADONZY
Отправлено: 08 Апреля, 2015 - 20:44:22
Post Id


Гость


Покинул форум
Сообщений всего: 104
Дата рег-ции: Июнь 2013  


Помог: 0 раз(а)




LIME, с моих старых вопросов, которые ты помнишь, много времени прошло и я, как и все, много чему научился. Если я что-то пишу, значит я это не с воздуха взял, а с достоверных источников. К тому-же сам тестировал и действительно разница есть и почему бы не последовать этому микро-производительному решению дабы еще на 1 микросекунду ускорить программу. Я хотел помочь, но вижу что ты начинаешь переходить на личное, а я не хочу принимать в этом участие.
 
 Top
LIME
Отправлено: 08 Апреля, 2015 - 21:56:33
Post Id


Активный участник


Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010  


Помог: 322 раз(а)




То есть мой вардамп ложь?
А если нет то почему бы просто не принять истину
И на личности я перешел зря, просто выбесило твое безапеляционное 'щас я напишу что вы все офигеете'
А тесты по поводу быстрадействия это еще надо посмотреть как ты их делал
Уже делали тут их
Причем я утверждал то же что ты сейчас
 
 Top
MADONZY
Отправлено: 08 Апреля, 2015 - 22:05:15
Post Id


Гость


Покинул форум
Сообщений всего: 104
Дата рег-ции: Июнь 2013  


Помог: 0 раз(а)




LIME пишет:
То есть мой вардамп ложь?

твой var_dump всегда вернет истину, так как все кроме '1'-'9' приведется к 0.
LIME пишет:
А тесты по поводу быстрадействия это еще надо посмотреть как ты их делал

вот так:
PHP:
скопировать код в буфер обмена
  1. define('LOOP',1000000);
  2.  
  3. function f1() {
  4.   for($i=0; $i<LOOP; ++$i) {
  5.     str_replace('_', '-', 'parse-url-without-regular-expression');
  6.   }
  7. }
  8. function f2() {
  9.   for($i=0; $i<LOOP; ++$i) {
  10.     preg_replace('/_/', '-', 'parse-url-without-regular-expression');
  11.   }
  12. }
  13. $start = microtime(true);
  14. f1();
  15. $stop = microtime(true);
  16. $time1 = $stop - $start;
  17.  
  18. $start = microtime(true);
  19. f2();
  20. $stop = microtime(true);
  21. $time2 = $stop - $start;
  22.  
  23. echo $time1 . "\t";
  24. echo $time2 . "\n";
 
 Top
LIME
Отправлено: 08 Апреля, 2015 - 22:09:26
Post Id


Активный участник


Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010  


Помог: 322 раз(а)




MADONZY пишет:
твой var_dump всегда вернет истину
так а я очем?УлыбкаУлыбкаУлыбка
а по поводу теста следующее
запускай их в разных процессах
Для разного размера текста
Может и докажешьУлыбка
Было бы интересно посмотреть результаты
И да....результаты приведи наверноеУлыбка
(Добавление)
А...еще память пиковою замерь
Регулярки ее жрутУлыбка

(Отредактировано автором: 08 Апреля, 2015 - 22:10:14)

 
 Top
MADONZY
Отправлено: 08 Апреля, 2015 - 23:24:20
Post Id


Гость


Покинул форум
Сообщений всего: 104
Дата рег-ции: Июнь 2013  


Помог: 0 раз(а)




LIME пишет:
запускай их в разных процессах
Было бы интересно посмотреть результаты


PHP 5.5
preg_replace - 3.9303209781647
str_replace - 2.359335899353
Разница ~49.95%
 
 Top
Страниц (2): [1] 2 »
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Вопросы новичков »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB