Данные строки создают массив и в него сохраняют все элементы строки, разделенными определенным знаком, в данном случае запятой.
Приведенный тобой кусок делает не то, что ты написал. Чему равно значение переменной $i? Полагаю, ты хотел организовать цикл по ней, но что-то тебя удержало.. )) Еще я не понимаю, зачем столько перекладываний. Ты мог бы эксплоудить сразу в нужный тебе массив, а если тебе надо, чтобы полученные элементы были заключены в угловые скобочки, то пройдись потом в цикле по массиву и добавь их (хотя мне кажется, что их лучше добавить потом - при выводе, обработке.. но это уже неважно). А уж в перекладчвании в $vol я вообще не вижу никакого смысла (кроме как показать компу, что он должен работать, а не спать)).
$new_arr = explode(",",$comb[$z]); for ($i=0; $i<count($new_array); i++) $new_arr = '<'.$new_arr.'>');
Вместо цикла for тут можно использовать foreach.
Короче, как я понял, тебе хочется иметь аналог функции explode.. Как ты, наверное, понимаешь, между PHP и Pascal есть существенная разница, касающаяся работы с памятью. Иначе говоря, тебе нужно: 1. либо завести заранее массив (строк) достаточного размера, чтоб в него влезли все элементы, на которые будет разбита исходная строка; 2. либо сначала выяснить, сколько элементов массива тебе потребуется (сосчитать кол-во разделителей, нарпимер); 3. либо использовать динамическую структуру (типа списка). Я для простоты буду предполагать первый вариант. Причем, я тут буду использовать конструкцию с открытым массивом.
Вот сама функция с примером использования:
const m= 100; // максимальное число элементов l= 20; // максимальная длина элемента
type tElement= string[l];
function Explode(c: char; s: string; var a: array of tElement): integer; var i,n: integer; begin n:=0; while Pos(c,s)>0 do begin Inc(n); a[n-1]:= Copy(s,1,Pos(c,s)-1); Delete(s,1,Pos(c,s)) end; if s<>'' then begin a[n]:= s; Inc(n) end; Explode:= n end;
var new_arr: array [1..m] of string[l]; NumEl,i: integer;
begin NumEl:= Explode(' ','Hello my dear World! ',new_arr); for i:=1 to NumEl do new_arr[i]:= '<'+new_arr[i]+'>'; // добавление угловых скобок for i:=1 to NumEl do WriteLn(i:2,' : ',new_arr[i]); ReadLn end.
Я не поручусь, что она работает в точности, как explode, поскольку не помню сейчас деталей. Исходя из здравого смысла, я сделал, чтобы количество элементов в результате разбора пустой строки было равно нулю, а также не вопринимаю пустоту после последнего разделителя как элемент. Пустота МЕЖДУ разделителями результирует в пустой элемент. Если тебе нужно этого избежать - кранчни строку перед разбором, например так:
while Pos(c+c,s)>0 do Delete(s,Pos(c+c,s)),1);
И еще.. Приведенный код очень неэффективен. Это, к сожалению, присуще Паскалю в данном случае ((. Оптимизация этого кода приведет к его раздуванию и все равно не даст максимальной эффективногсти. В Си, с его концепцией приписывания значения оператору присваивания, можно написать и короче, и эффективнее..
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.