За последние 24 часа нас посетили 53584 программиста и 1765 роботов. Сейчас ищут 1465 программистов ...

чтение текстовых строк

Тема в разделе "PHP для новичков", создана пользователем Эх!, 22 июл 2010.

  1. Эх!

    Эх! Активный пользователь

    С нами с:
    23 окт 2009
    Сообщения:
    24
    Симпатии:
    0
    Здравствуйте!

    есть текстовые строки вида С:\Папка1\Папка2\Папка3\файлик5
    С:\Папка1\Папка2\Папка4\файлик6
    С:\Папка1\Папка2\Папка5\файлик7
    Я их считываю
    Код (Text):
    1.  
    2. for ($j=0;$j<count($namefile);$j++)
    3. {
    4. if(eregi("C:.Папка1.Папка2.(.*)" ,$d[$j],$r)
    5. {
    6. $vsStroka=$r[0]; //вся строка
    7.  
    8. }
    9. }
    Скажите пожалуйста как мне можно в отдельных переменных вывести имена Папок 3,4,5 и файликов 5,6,7
     
  2. Ensiferum

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

    С нами с:
    11 июл 2010
    Сообщения:
    1.292
    Симпатии:
    0
    Адрес:
    из секты поклонников Нео
    Если я правильно понял задачу, то можно вот так:
    PHP:
    1. <?
    2. for ($j=0, $count=sizeof($namefile);$j<$count;$j++)
    3. {
    4.     $temp = explode('/',$d[$j]);
    5.     $temp_count = sizeof($temp);
    6.     $imyafayla = $temp[$temp_count];
    7.     $imyapapki = $temp[$temp_count-1];
    8. }
    9. ?>
    или конечные строки заменить на array_pop()
     
  3. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    я бы сделал ченить типа '/^(\w):\\(.*)\\*([a-z0-9а-я_\.,-])$/', а путь до файла уже бить эксплодом.

    О, Эйнсферум красиво сделал. Только кажется не '/', а '\', но это уже детали.
     
  4. artoodetoo

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

    С нами с:
    11 июн 2010
    Сообщения:
    11.128
    Симпатии:
    1.248
    Адрес:
    там-сям
    Теме место в разделе "Регулярные выражения".

    Про PHP: непринципиально, но выдаёт зеленого новичка
    • count() внутри for — дурной тон, принято выносить за пределы цикла лишние вычисления.
      непонятно — count() от одного массива, а в eregi() элемент другого. жуть.
    • $j++ — работает также как ++$j, но медленнее. вообще здесь уместнее foreach :)
    • eregi — устаревшая функция, лучше заменить на preg_*
    • двойные кавычки лучше использовать только там, где реально надо в строку спецсимвол вставить или переменную. чревато неожиданными ошибками
    • эту задачку проще решить через explode('\\', $s)

    уф!!!

    PHP:
    1. foreach ($files as $file) {
    2.   $parts = explode('\\', $file);
    3.   $dirs[] = $parts[3];
    4.   $names[] = $parts[4];
    5. }
     
  5. artoodetoo

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

    С нами с:
    11 июн 2010
    Сообщения:
    11.128
    Симпатии:
    1.248
    Адрес:
    там-сям
    хехе, успели раньше запостить про explode )))
    ага, array_pop() даст бОльшую гибкость
     
  6. Ensiferum

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

    С нами с:
    11 июл 2010
    Сообщения:
    1.292
    Симпатии:
    0
    Адрес:
    из секты поклонников Нео
    foreach дольше for
     
  7. artoodetoo

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

    С нами с:
    11 июн 2010
    Сообщения:
    11.128
    Симпатии:
    1.248
    Адрес:
    там-сям
    ошибаешся. гугли!

    edited: хотя… наверное зависит от контекста. если тупо крутить счетчик с пустым телом цикла, то for наверное быстрее, но нам же нужен элемент массива. вот с ним надо мерять. в общем я спорить не возьмусь :)
     
  8. Ensiferum

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

    С нами с:
    11 июл 2010
    Сообщения:
    1.292
    Симпатии:
    0
    Адрес:
    из секты поклонников Нео
  9. artoodetoo

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

    С нами с:
    11 июн 2010
    Сообщения:
    11.128
    Симпатии:
    1.248
    Адрес:
    там-сям
    в анголоязычном интернете видел такую лесенку:
    while
    foreach
    for

    но, повторюсь, тест должен использовать элемент массива, ради которого затевался цикл
     
  10. Апельсин

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

    С нами с:
    20 мар 2010
    Сообщения:
    3.645
    Симпатии:
    2
    нашли о чем спорить. А на практике обычно все забивают болт на такую оптимизацию и пишут как легче.
     
  11. Volt(220)

    Volt(220) Активный пользователь

    С нами с:
    11 июн 2009
    Сообщения:
    1.640
    Симпатии:
    1
    Свои 5 копеек.

    Спичечная оптимизация? =))

    Ensiferum
    Мне foreach больше нравиться, лучше высказывает мысль. Мне ведь не сколько-то раз что-то сделать надо, а сделать что-то со всеми элементами массива. =))
     
  12. Ensiferum

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

    С нами с:
    11 июл 2010
    Сообщения:
    1.292
    Симпатии:
    0
    Адрес:
    из секты поклонников Нео
    Я сам юзаю foreach, когда массив небольшой.
     
  13. Volt(220)

    Volt(220) Активный пользователь

    С нами с:
    11 июн 2009
    Сообщения:
    1.640
    Симпатии:
    1
    Ensiferum
    Там по ссылке тест для foreach не совсем верен. В аналогичный цикл for нужно вставить получение элемента массива, тогда можно сравнивать.
    И кстати:
    http://www.php.ru/forum/viewtopic.php?t=19244
     
  14. artoodetoo

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

    С нами с:
    11 июн 2010
    Сообщения:
    11.128
    Симпатии:
    1.248
    Адрес:
    там-сям
    я юзаю форич всегда, когда надо выбирать элемент массива. он самый наглядный, imho

    провел тест. как любой тест он необъективен, но он про то, о чем я говорю — "цикл для выбора из массива".
    результаты прогонов, чем цифра меньше — тем лучше:
    for: 5.49082279205, while: 3.49667286873, foreach: 2.82413101196
    for: 5.52177500725, while: 3.53155899048, foreach: 2.8313100338
    for: 5.38458681107, while: 3.52433896065, foreach: 2.76259207726
    стабильно :)

    PHP:
    1.  
    2. <?php
    3.  
    4.  
    5. // step 1: get big array
    6.  
    7. $a = array();
    8. for ($i=0; $i<10000; ++$i) $a[] = rand();
    9.  
    10. // step 2: benchmark
    11.  
    12. $t = microtime(TRUE);
    13. for ($k=0; $k<1000; ++$k) {
    14.     for ($i=0, $n=count($a); $i<$n; ++$i) {$b = $a[$i];}
    15. }
    16. $tFor = microtime(TRUE) - $t;
    17.  
    18. $t = microtime(TRUE);
    19. for ($k=0; $k<1000; ++$k) {
    20.     $i=0;
    21.     $n=count($a);
    22.     while ($i<$n) {$b = $a[$i++];}
    23. }
    24. $tWhile = microtime(TRUE) - $t;
    25.  
    26. $t = microtime(TRUE);
    27. for ($k=0; $k<1000; ++$k) {
    28.     foreach ($a as $item) {$b = $item;}
    29. }
    30. $tForeach = microtime(TRUE) - $t;
    31.  
    32. // step 3: print results
    33.  
    34. header('Content-type: text/plain');
    35. echo "for: {$tFor}, while: {$tWhile}, foreach: {$tForeach}\n";
    36.  
     
  15. Volt(220)

    Volt(220) Активный пользователь

    С нами с:
    11 июн 2009
    Сообщения:
    1.640
    Симпатии:
    1
    =))
     
  16. artoodetoo

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

    С нами с:
    11 июн 2010
    Сообщения:
    11.128
    Симпатии:
    1.248
    Адрес:
    там-сям
    он в блоке инициализации, а не в проверке. все нормуль
     
  17. Volt(220)

    Volt(220) Активный пользователь

    С нами с:
    11 июн 2009
    Сообщения:
    1.640
    Симпатии:
    1
    sorry, не заметил.
     
  18. artoodetoo

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

    С нами с:
    11 июн 2010
    Сообщения:
    11.128
    Симпатии:
    1.248
    Адрес:
    там-сям
    микрооптимизация не главное, foreach нагляднее, вот за что я его люблю :)
     
  19. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    согласен с фруктом.

    Но в качестве развития, почитал ветку.

    ЗЫ: люблю фор больше форыча.
     
  20. Эх!

    Эх! Активный пользователь

    С нами с:
    23 окт 2009
    Сообщения:
    24
    Симпатии:
    0
    Спасибо большое!!! Получилось следующее,используя все Ваши советы:
    Код (Text):
    1. $count=sizeof($d);
    2.   for ($j=0;$j<$count;$j++)
    3.   {
    4.       $temp = explode('\\',$d[$j]);
    5.       $temp_count = sizeof($temp);
    6.       $imyafayla = $temp[$temp_count];
    7.       $imyapapki = $temp[$temp_count-1];
    8.   }
     
  21. artoodetoo

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

    С нами с:
    11 июн 2010
    Сообщения:
    11.128
    Симпатии:
    1.248
    Адрес:
    там-сям
    садись — три с минусом!
     
  22. Эх!

    Эх! Активный пользователь

    С нами с:
    23 окт 2009
    Сообщения:
    24
    Симпатии:
    0
    Все так плохо!
     
  23. Ensiferum

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

    С нами с:
    11 июл 2010
    Сообщения:
    1.292
    Симпатии:
    0
    Адрес:
    из секты поклонников Нео
    Используй лучше это:
    PHP:
    1. <?
    2. foreach ($d as $t) {
    3.     $temp = explode('\\',$t);
    4.     $imyafayla = array_pop($temp);
    5.     $imyapapki = array_pop($temp);
    6. }
    7. ?>
     
  24. Эх!

    Эх! Активный пользователь

    С нами с:
    23 окт 2009
    Сообщения:
    24
    Симпатии:
    0
    Ensiferum Спасибо!!![/b]