За последние 24 часа нас посетили 52409 программистов и 1758 роботов. Сейчас ищут 955 программистов ...

Косяк в цикле, нид хелп

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

  1. False_True

    False_True Новичок

    С нами с:
    7 сен 2015
    Сообщения:
    37
    Симпатии:
    0
    Повторюсь что до этого писал на с++. Кроме главного вопроса касательно работы программы, хочу узнать возможно ли указать тип символьного массива при инициализации (как в си). Касаемо главного вопроса, пробовал отслеживать работу программы посимвольно - проходит весь фильтр до условия равно ли " правильно, последнее условие игнорирует. Думаю что это ошибки синтаксиса, прошу помочь с решением

    Код (PHP):
    1. <?php
    2. $id_images='<img align="left" vspace="5" hspace="10" src="http://kor.ill.in.ua/m/190x120/1680496.jpg">Корреспондент.net выделяет главные события вчерашнего дня.
    3. >';
    4. $f=0;
    5. echo strlen($id_images) . '</br>';
    6.  
    7. for($i=0; $i<strlen($id_images); $i++)
    8. {
    9.     if($id_images[$i]==="h")
    10.     {
    11.         echo "h - ";
    12.         echo "$i" . '</br>';
    13.         if($id_images[$i+1]==="t")
    14.         {
    15.             echo "t - ";
    16.             echo "$i" . '</br>';
    17.             if($id_images[$i+2]==="t")
    18.             {
    19.                 echo "t - ";
    20.                 echo "$i" . '</br>';
    21.                 if($id_images[$i+3]==="p")
    22.                 {
    23.                     echo "p - ";
    24.                     echo "$i" . '</br>';
    25.                     for($img=$i; $img<strlen($id_images); $img++)
    26.                     {
    27.                         if($id_images[$i]!=="\"")
    28.                         {
    29.                             $link_image[$f]  = (string) $id_images[$img];
    30.                             $f++;
    31.                         }
    32.                         else
    33.                         {
    34.                             break;
    35.                         }
    36.                     }
    37.                 }
    38.             }
    39.         }
    40.     }
    41. }
     
  2. denis01

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

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    типы переменных https://secure.php.net/manual/ru/language.types.php

    а по коду не вижу вопроса, укажи строчку или что хочешь сделать

    пример
    Код (PHP):
    1. <pre>
    2. <?php
    3. $id_images='<img align="left" vspace="5" hspace="10" src="http://kor.ill.in.ua/m/190x120/1680496.jpg">';
    4. $doc = new DOMDocument();
    5. $doc->loadHTML($id_images);
    6. $dom = simplexml_import_dom($doc);
    7. var_export($dom);
    8. echo $dom->body->img['src'];
    9. print_r(parse_url($dom->body->img['src']));
    10.  
    если переходишь в web и из C++, то говори сразу задачу, PHP очень сильно заточен на работу с текстом, быстро умирает программа

    работать с html можно с помощью регулярных выражений, PHP DOMDocument и http://simplehtmldom.sourceforge.net/ (CSS селекторы прочитай)
     
  3. False_True

    False_True Новичок

    С нами с:
    7 сен 2015
    Сообщения:
    37
    Симпатии:
    0
    Я писал на си и я хорошо знаю что такое типы данных, более того в си они указываются явно при инициализации;
    в данном случае регексп не нужен, объем данных не тот.

    я хочу вывести строку в которой будет чистый урл картинки без хтмл тегов. Код поправлял после выкладывания, в том числе и
    Код (PHP):
    1. if($id_images[$i]!=="\"")
    на
    Код (PHP):
    1. if($id_images[$i]!=="\"")
    но понту 0. Программа ужасно работает со счетчиками, возможо удел php на С++ этот алгоритм работает.

    Исходный массив символов заполнен только символами из фильтра "h,t,t,p", при попытке вывести >=4 элемента пустое место. При проверке is_string выдает false;
     
  4. denis01

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

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    False_True я написал что есть как минимум 3 способа для работы с HTML.
    Дал пример как получить содержание src атрибута у тега img.

    Продублирую код, в том что выше, больше информации
    Код (PHP):
    1. <pre>
    2. <?php
    3. $id_images='<img align="left" vspace="5" hspace="10" src="http://kor.ill.in.ua/m/190x120/1680496.jpg">';
    4. $doc = new DOMDocument();
    5. $doc->loadHTML($id_images);
    6. $dom = simplexml_import_dom($doc);
    7. echo $dom->body->img['src']; 
    ты пытаешься написать велосипед

    Добавлено спустя 1 минуту 59 секунд:
    Зачем тебе указывать определённый тип переменных?

    Добавлено спустя 1 минуту 30 секунд:
    https://secure.php.net/manual/ru/language.types.intro.php
     
  5. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    нет. и не надо.
     
  6. False_True

    False_True Новичок

    С нами с:
    7 сен 2015
    Сообщения:
    37
    Симпатии:
    0
    не буду спорить скажу лишь что это удел по большой части, решения должен принимать программист а не компилятор, такая точка зрения выражена не только мной но и многими авторами популярных изданий, к примеру тот же Прата.

    спасибо, но не знаю как с ДОМ, но при парсинге в обычную строку выводит результат без разширения
     
  7. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    в пхп всё иначе. он медленный, но имеет много встроенных скомпилированных функций. Поэтому привычные операции получаются очень быстрыми.

    Твоя задача в пхп решается через http://php.ru/manual/function.strpos.html и сводится к двум строкам кода.
    echo $i . '</br>';
     
  8. denis01

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

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    о чём ты?
     
  9. False_True

    False_True Новичок

    С нами с:
    7 сен 2015
    Сообщения:
    37
    Симпатии:
    0
    например, урлкартинки.jpeg выводит как урлкартинки
     
  10. denis01

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

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    False_True лучше покажи код в котором это видно, так будет понятнее
     
  11. False_True

    False_True Новичок

    С нами с:
    7 сен 2015
    Сообщения:
    37
    Симпатии:
    0
    Ну если не считать размер прототипа функции. Ну опять таки, это далеко не все решение, мы не знаем длины нужной строки, если найдем нужно будет делать присваивание в другой массив символов, что впринципе не короче моего алгоритма. Да там есть косяки в синтаксисе, но основная проблема задачи в том что цикл не останавливается как это требуется на символе ".

    Простите за придирчивость, просто хочу понимать логику.

    Хочу спросить является ли правильным сравнение?

    Код (PHP):
    1. if($id_images[$i]!=="\"") 
     
  12. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    просто на пхп стоит программировать не так, как ты привык это делать на сях.
     
  13. False_True

    False_True Новичок

    С нами с:
    7 сен 2015
    Сообщения:
    37
    Симпатии:
    0
    Согласен, PHP и С# в плане отличий от С++ очень схожи, поскольку потребляют скомплированные функции, С++ же алгоритмический.


    Всем спасибо, за помощь и дискуссию, нашел солюшн; Сделал в 2х коротких циклах, первый-фильтр, второй читает до. Думаю данный алгоритм имеет право на жизнь особенно при обработке fulltext в XML

    Код (PHP):
    1. <?php
    2. $id_images='<img align="left" vspace="5" hspace="10" src="http://kor.ill.in.ua/m/190x120/1680496.jpg">';
    3. echo strlen($id_images) . '</br>';
    4. $c=0;
    5. for($i=0; $i<strlen($id_images); $i++)
    6. {
    7.     if($id_images[$i]==="h")
    8.     {
    9.         if($id_images[$i+1]==="t")
    10.         {
    11.             if($id_images[$i+2]==="t")
    12.             {
    13.                 if($id_images[$i+3]==="p")
    14.                 {
    15.                     $n_pos=$i;
    16.                     echo "$n_pos" . '</br>';
    17.                     $i=strlen($id_images);
    18.                 }
    19.             }
    20.         }
    21.     }
    22. }
    23. for($s=$n_pos; $s<strlen($id_images); $s++ )
    24. {
    25.     if($id_images[$s]=='"')
    26.     {
    27.         break;
    28.     }
    29.     else
    30.     {
    31.         $new_link[$c]=$id_images[$s];
    32.         echo $new_link[$c];
    33.         $c=$c+1;
    34.     }
    35. } 
     
  14. denis01

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

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    Это как в C++ вставлять асемблерные вставки, чтобы не использовать готовый Windows API, вот что я думаю когда смотрю на этот код.
    PHP написан на C++ и т.д., считай PHP это как высокоуровневая обёртка и вместо того чтобы ты использовал бы методы и функции которая она предоставляет ты отказываешься от них и пишешь снова так как делал бы на C++ когда эти функции уже написаны до тебя на том же C++.
    Может проще было бы взять C++ и HTTP библиотеку на нём и не мучить PHP?
     
  15. False_True

    False_True Новичок

    С нами с:
    7 сен 2015
    Сообщения:
    37
    Симпатии:
    0
    Вы знаете прототипы всех функций с которыми работаете? Для работы программы которую я пишу важен каждый байт памяти, поскольку нагрузка на сервер будет очень большая, потому я так придирчиво отношусь к каждой подпрограмме.

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

    По поводу ассемблера Вы не правы, знание ассемблера существенно повышает уровень программирования. Все не идеально, мир не идеален, я не идеален, обертки не идеальны.
     
  16. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    Ой, нет. Ты не с того конца зашел тогда. Вон го и раст. А пхп каждый раз запускается, память не контролирует, ему плевать, он через 10-300 мс завершится. Его задача текст из БД брать и украшать. Не более того. Но на мой взгляд пхп весьма быстрый. Если работать с ним так оно задумано.
     
  17. denis01

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

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    False_True если бы всегда нужна была бы скорость программы, то все бы до сих пор писали на ассемблере, тут все за разумную скорость, по этому и недопонимание, теперь я понимаю что кровь из носу тебе нужно получить скорость работы твоей программы на PHP, хотя этот язык не для этого, а для удобства.
     
  18. False_True

    False_True Новичок

    С нами с:
    7 сен 2015
    Сообщения:
    37
    Симпатии:
    0
    А если на сервер идет поток данных по 10-15 тыс файлов в сутки (которые всячески обрабатываются) и помимо этого на сервере работает еще и сайт который терпит в сутки 10-50 тыс юзеров которые комментируют и регистрируются.

    Тот фрагмент что я решал это всего лишь одна сотая той программы которая должна работать.

    Производительность сервера стоит денег, при чем их нужно платить каждый месяц, программу можно написать один раз и с экономить расходы.
     
  19. romach

    romach Старожил

    С нами с:
    26 окт 2013
    Сообщения:
    2.904
    Симпатии:
    719
    False_True, если вы пишете на php приложение, которое должно считать каждый байт, то вы делаете что-то не так и нужно сменить подход.

    1. К пыху можно писать расширения прямо на сях, таким образом убрав внутрь все сложные алгоритмы и и предоставив приложению набор функций для работы с ними. Возможно вам как сишнику это будет проще )
    2. Приложение не обязательно должно быть чисто пыховским или чисто сишным ) Ни что не мешает вам реализовать отдельные задачи на других языках. К примеру я недавно задачу, которая требовала на пыхе нереального для сервера количества оперативки написал на golang + revel (советую глянуть, довольно занимательный язык), пых же просто стучиться к нему как к обычному веб-сервису и забирает нужные результаты.

    Идея проста: все что действительно требовательно к ресурсам (в реальности, а не потому что так кажется) переписать на более подходящие языки. Все остальное (клиентский интерфейс, операции с БД, несложные расчеты) доверить пыху, на нем, при использовании местных фреймворков это делается гораздо быстрее и проще.
     
  20. False_True

    False_True Новичок

    С нами с:
    7 сен 2015
    Сообщения:
    37
    Симпатии:
    0
    Пишу функции в отдельном пхп файле, включаю их в каждый требующий это файл, зачем усложнять.
     
  21. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
    False_True, вам же объясняют - интерпретатор php не самая быстрая вещь на свете, он не предназначен для сложных алгоритмов. И я не думаю, что при всей вашей аргументации ваш код будет работать быстрее, чем, к примеру, strpos, которая написана на C и скомпилирована. И писать на php сложнейший какой-нибудь алгоритм, и ожидать что он будет быстро работать - бессмысленно.
     
  22. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    это всё размытые разговоры. Нужно оценивать по фактической конфигурации и нагрузке, которую создают люди. У меня вон форум без оптимизаций выдаёт 175 страниц в секунду. Такими темпами 50к просмотров можно протащить за пять минут.

    С обработкой файлов сложнее. Количество потоков пхп лучше держать по количеству ядер, соотв. если дюжина народу ливанёт файлы и пхп будет эти файлы жевать, то всё это залпинет.
     
  23. False_True

    False_True Новичок

    С нами с:
    7 сен 2015
    Сообщения:
    37
    Симпатии:
    0
    Мы говорим о разных вещах - я говорю о нагрузке обработчиками, ты мне говоришь о стабильном трафике. Даже если взять трафик, то тут есть существенные отличия, трафик на форуме прогнозируем а на агрегаторе - нет и пиковая нагрузка может случится в любой момент. Обработка файлов далеко не весь функционал, есть еще рейтинг который берет инфу из вне и работает реал тайм.
     
  24. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    я честно говоря вообще никаких нагрузок не вижу в том, что ты говоришь. Прости. Ладно. Не хочешь развивать тему - бон вояж.
     
  25. False_True

    False_True Новичок

    С нами с:
    7 сен 2015
    Сообщения:
    37
    Симпатии:
    0
    Согласен что портит код, сделал отдельную функцию, включил через реквайр. Нагрузка не нагрузка, но мне в этом месте было удобнее написать свой алгоритм - я знаю как он работает и это главное если что то в программе пойдет не так. Если начну писать о том что грузит сайт это будет другая тема, не хочу офтопить. Могу создать новую и обсудить в ней, может будут дельные советы по оптимизации.