Здравствуйте! есть текстовые строки вида С:\Папка1\Папка2\Папка3\файлик5 С:\Папка1\Папка2\Папка4\файлик6 С:\Папка1\Папка2\Папка5\файлик7 Я их считываю Код (Text): for ($j=0;$j<count($namefile);$j++) { if(eregi("C:.Папка1.Папка2.(.*)" ,$d[$j],$r) { $vsStroka=$r[0]; //вся строка } } Скажите пожалуйста как мне можно в отдельных переменных вывести имена Папок 3,4,5 и файликов 5,6,7
Если я правильно понял задачу, то можно вот так: PHP: <? for ($j=0, $count=sizeof($namefile);$j<$count;$j++) { $temp = explode('/',$d[$j]); $temp_count = sizeof($temp); $imyafayla = $temp[$temp_count]; $imyapapki = $temp[$temp_count-1]; } ?> или конечные строки заменить на array_pop()
я бы сделал ченить типа '/^(\w):\\(.*)\\*([a-z0-9а-я_\.,-])$/', а путь до файла уже бить эксплодом. О, Эйнсферум красиво сделал. Только кажется не '/', а '\', но это уже детали.
Теме место в разделе "Регулярные выражения". Про PHP: непринципиально, но выдаёт зеленого новичка count() внутри for — дурной тон, принято выносить за пределы цикла лишние вычисления. непонятно — count() от одного массива, а в eregi() элемент другого. жуть. $j++ — работает также как ++$j, но медленнее. вообще здесь уместнее foreach eregi — устаревшая функция, лучше заменить на preg_* двойные кавычки лучше использовать только там, где реально надо в строку спецсимвол вставить или переменную. чревато неожиданными ошибками эту задачку проще решить через explode('\\', $s) уф!!! PHP: foreach ($files as $file) { $parts = explode('\\', $file); $dirs[] = $parts[3]; $names[] = $parts[4]; }
ошибаешся. гугли! edited: хотя… наверное зависит от контекста. если тупо крутить счетчик с пустым телом цикла, то for наверное быстрее, но нам же нужен элемент массива. вот с ним надо мерять. в общем я спорить не возьмусь
в анголоязычном интернете видел такую лесенку: while foreach for но, повторюсь, тест должен использовать элемент массива, ради которого затевался цикл
Свои 5 копеек. Спичечная оптимизация? =)) Ensiferum Мне foreach больше нравиться, лучше высказывает мысль. Мне ведь не сколько-то раз что-то сделать надо, а сделать что-то со всеми элементами массива. =))
Ensiferum Там по ссылке тест для foreach не совсем верен. В аналогичный цикл for нужно вставить получение элемента массива, тогда можно сравнивать. И кстати: http://www.php.ru/forum/viewtopic.php?t=19244
я юзаю форич всегда, когда надо выбирать элемент массива. он самый наглядный, 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: <?php set_time_limit(0); // step 1: get big array $a = array(); for ($i=0; $i<10000; ++$i) $a[] = rand(); // step 2: benchmark $t = microtime(TRUE); for ($k=0; $k<1000; ++$k) { for ($i=0, $n=count($a); $i<$n; ++$i) {$b = $a[$i];} } $tFor = microtime(TRUE) - $t; $t = microtime(TRUE); for ($k=0; $k<1000; ++$k) { $i=0; $n=count($a); while ($i<$n) {$b = $a[$i++];} } $tWhile = microtime(TRUE) - $t; $t = microtime(TRUE); for ($k=0; $k<1000; ++$k) { foreach ($a as $item) {$b = $item;} } $tForeach = microtime(TRUE) - $t; // step 3: print results header('Content-type: text/plain'); echo "for: {$tFor}, while: {$tWhile}, foreach: {$tForeach}\n";
Спасибо большое!!! Получилось следующее,используя все Ваши советы: Код (Text): $count=sizeof($d); for ($j=0;$j<$count;$j++) { $temp = explode('\\',$d[$j]); $temp_count = sizeof($temp); $imyafayla = $temp[$temp_count]; $imyapapki = $temp[$temp_count-1]; }
Используй лучше это: PHP: <? foreach ($d as $t) { $temp = explode('\\',$t); $imyafayla = array_pop($temp); $imyapapki = array_pop($temp); } ?>