За последние 24 часа нас посетили 63035 программистов и 1741 робот. Сейчас ищут 904 программиста ...

тема: Оптимизация функции конвертации строки из charcode

Тема в разделе "Прочие вопросы по PHP", создана пользователем igrok54, 30 ноя 2015.

  1. igrok54

    igrok54 Активный пользователь

    С нами с:
    20 май 2009
    Сообщения:
    10
    Симпатии:
    0
    Адрес:
    Пермь
    Используется при парсинге базы товаров из XLS-файла
    Была такая функция:
    Код (PHP):
    1. function uc2html($str) {
    2.     $ret = '';
    3.     for( $i=0; $i<strlen($str)/2; $i++ ) {
    4.         $charcode = ord($str[$i*2])+256*ord($str[$i*2+1]);
    5.         $ret .= html_entity_decode('&#'.$charcode.';',ENT_NOQUOTES,'UTF-8');
    6.     }
    7.     return $ret;
    8. } 
    Excel-файл размером 1.5Мб разбирался секунд 40-45, и наибольшие тормоза создает именно данная функция.

    Перенос в функции html_entity_decode из цикла в результирующую строку сократил время обработки файла в 3 раза - время обработки стало около 15 секунд.
    Код (PHP):
    1. function uc2html($str) {
    2.     $ret = '';
    3.     for( $i=0; $i<strlen($str)/2; $i++ ) {
    4.         $charcode = ord($str[$i*2])+256*ord($str[$i*2+1]);
    5.         $ret .= '&#'.$charcode.';';
    6.     }
    7.     return html_entity_decode($ret,ENT_NOQUOTES,'UTF-8');
    8. } 
    Вопрос: можно ли еще оптимизировать эту функцию? Хотелось бы избавиться от цикла. Мысли такие: заменить цикл на str_split -> array_map -> implode -> html_entity_decode
    Но запутался в математике. Прошу помочь.

    PHP, JavaScript, SQL и другой код пишите внутри тегов
    Код ( (Unknown Language)):
    1. [b]php][/b]Тут код[b][/[/b][b]code][/b][/color]
     
  2. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    я что-то не понимаю зачем там в принципе такие сложности при декодировании. что мешает сразу декод вызвать? ну и там может быть грандиозная ошибка если вдруг символы входящие в аски будут - ты берешь последовательность из двух байт, делаешь из них энтити и потом это энтити пытаешься декодировать как один символ. но их же там должно быть два.
     
  3. igrok54

    igrok54 Активный пользователь

    С нами с:
    20 май 2009
    Сообщения:
    10
    Симпатии:
    0
    Адрес:
    Пермь
    Плиз, подскажи как сразу декод вызвать?!!
     
  4. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    пфххахахахахахах... логику даже не в школьном курсе основ программирования преподают. её в дошкольном образовании развивают.
    Код (PHP):
    1. function uc2html($str) {
    2.     return $str;
    3. } 
    вот те патч. функция сразу вернет ту строку с которой её вызвали. без регистрации и смс. и без всякого дэкода. надеюсь не надо рассказывать почему я решил ничего не декодировать?
     
  5. igrok54

    igrok54 Активный пользователь

    С нами с:
    20 май 2009
    Сообщения:
    10
    Симпатии:
    0
    Адрес:
    Пермь
    1) Не работает. Возвращаемая строка в нечитаемом виде. Обработка нужна.
    2) Возвращаемая строка должна быть читаема не только людям в браузере, но и поисковым роботам, то есть вариант строки в виде
    Код (Text):
    1. &#1072;&#1084;...
    не подходит.
    3) Прости, когда я в школе учился понятия "Основы программирования" еще не было. Разве что в университетах... Староват я, признаю.
     
  6. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    исходную строку можно?
     
  7. igrok54

    igrok54 Активный пользователь

    С нами с:
    20 май 2009
    Сообщения:
    10
    Симпатии:
    0
    Адрес:
    Пермь
  8. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    нема картинки. 404....
    а почему текстом не передать? хексануть можно для безопасности. или бейз-шестидесяти-четырнуть.
     
  9. igrok54

    igrok54 Активный пользователь

    С нами с:
    20 май 2009
    Сообщения:
    10
    Симпатии:
    0
    Адрес:
    Пермь
    Картинку перезалил
     
  10. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    нет, пожалуйста в закодированном виде. base64 и результат сюда. я должен декодировать и получить исходную строку для работы с ней а не с тем как она выглядит на скриншоте.
     
  11. igrok54

    igrok54 Активный пользователь

    С нами с:
    20 май 2009
    Сообщения:
    10
    Симпатии:
    0
    Адрес:
    Пермь
    В базе 64 (первая строка код, вторая - расшифровка)
    GgRABD4EMgQwBEIEOAQgAFAAbwBoAGoAYQBuAG0AYQBhAG4A
    Кровати Pohjanmaan

    PABwAD4AIQQgAD0ENQQ0BDAEMgQ9BDUEMwQ+BCAAMgRABDUEPAQ1BD0EOAQgAEQEMAQxBEAEOAQ6BDAEIAA/BEAEOARBBEIEQwQ/BDgEOwQwBCAAOgQgAD8EQAQ+BDgENwQyBD4ENARBBEIEMgRDBDwAcwB0AHIAbwBuAGcAPgAgADoEQAQ+BDIEMARCBDUEOQQgADgEIAA8BDAEQgRABDAEQQQ+BDIEPAAvAHMAdAByAG8AbgBnAD4ALgA8AC8AcAA+ACAAPABwAD4AEgQgADoEPgQ7BDsENQQ6BEYEOAQ4BCAAUABvAGgAagBhAG4AbQBhAGEAbgAsACAAOgRABD4EPAQ1BCAAOgRABD4EMgQwBEIENQQ5BCwAIAA/BEAEOARBBEMEQgRBBEIEMgRDBE4EQgQgADwENQQxBDUEOwRMBCAAMgQgADoEMARCBDUEMwQ+BEAEOARPBEUEOgA8AC8AcAA+ACAAPAB1AGwAPgAgADwAbABpAD4APABhACAAaAByAGUAZgA9ACIALwBkAGkAdgBhAG4AaQAtAGkALQBrAHIAZQBzAGwAYQAtAHAAbwBoAGoAYQBuAG0AYQBhAG4ALgBoAHQAbQBsACIAPgAUBDgEMgQwBD0ESwQgADgEIAA6BEAENQRBBDsEMAQ8AC8AYQA+ADwALwBsAGkAPgAgADwAbABpAD4APABhACAAaAByAGUAZgA9ACIALwB6AGgAdQByAG4AYQBsAG4AaQBlAC0AcwB0AG8AbABpAGsAaQAtAHAAbwBoAGoAYQBuAG0AYQBhAG4ALQAuAGgAdABtAGwAIgA+ABYEQwRABD0EMAQ7BEwEPQRLBDUEIABBBEIEPgQ7BDgEOgQ4BDwALwBhAD4APAAvAGwAaQA+ACAAPABsAGkAPgA8AGEAIABoAHIAZQBmAD0AIgAvAHMAdABvAGwAbwB2AGkAZQAtAGcAcgB1AHAAcAAtAHAAbwBoAGoAYQBuAG0AYQBhAG4ALgBoAHQAbQBsACIAPgAhBEIEPgQ7BD4EMgRLBDUEIAAzBEAEQwQ/BD8ESwQ8AC8AYQA+ADwALwBsAGkAPgAgADwALwB1AGwAPgA=
    <p>С недавнего времени фабрика приступила к производству<strong> кроватей и матрасов</strong>.</p> <p>В коллекции Pohjanmaan, кроме кроватей, присутствуют мебель в категориях:</p> <ul> <li><a href="/divani-i-kresla-pohjanmaan.html">Диваны и кресла</a></li> <li><a href="/zhurnalnie-stoliki-pohjanmaan-.html">Журнальные столики</a></li> <li><a href="/stolovie-grupp-pohjanmaan.html">Столовые группы</a></li> </ul>
     
  12. igrok54

    igrok54 Активный пользователь

    С нами с:
    20 май 2009
    Сообщения:
    10
    Симпатии:
    0
    Адрес:
    Пермь
    Вопрос решил кодом, обрабатывающим всю строку разом:
    Код (PHP):
    1. mb_convert_encoding($str,'UTF-8','UCS-2LE'); 
    Вместо UCS-2LE можно UTF-16LE и byte2le. Время выполнения скрипта стало (Ура!) 0.2 сек. Прогресс 45сек -> 15сек -> 0.2сек.

    PHP, JavaScript, SQL и другой код пишите внутри тегов
    Код ( (Unknown Language)):
    1. [b]php][/b]Тут код[b][/[/b][b]code][/b][/color]
     
  13. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
    А зачем самому писать парсинг ёкселя? Есть же чудесный PHPExcel
     
  14. igrok54

    igrok54 Активный пользователь

    С нами с:
    20 май 2009
    Сообщения:
    10
    Симпатии:
    0
    Адрес:
    Пермь
    PHPExcel весит в три раза больше движка, для которого мне нужен разбор XLS. В PHPExcel конечно много плюшек, но мне они в данном случае не требуются, нужно просто получить отпарсенные с xls данные в виде массива. А данная библиотека - 1 файл весом 45 кб, быстро и прекрасно парсит файлы excel версии MS офис-2003. Решавшаяся в топике задача была связана уже со стадией обработки данных, полученных в результате работы класса.
     
  15. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
    Ну мне места обычно не жалко. А вот так маяться терпеть не могу.