php'owskie implode

0

Joł, jak ktoś nie wie, o co chodzi z implode to tłumaczę. Otóż mamy jakąś tablicę, a ta funkcja zwraca stringa składającego się z elementów tablicy oddzielonych jakimś znakiem.

Próbowałem sobie coś takiego zrobić, ale napotkałem zonka.

Otóż deklaracja wygląda tak:

function implode(tab: array of Variant; delimiter: string=','): string;

Okazało się, że mam lekko mylne pojęcie, bo nie mogę wywołać tej funkcji np tak:

implode(resultArray[i-1], '; ');

{resultArray jest tablicą dwuwymiarową, dynamiczną(obydwa wymiary dynamiczne)}

Mam incompatible types. Wiem mniej więcej jak to rozwiązać, ale dla tego konkretnego przypadku. Natomiast ja chcę używać tej funkcji dla każdej tablicy. Jak to zrobić?

0

napisz sobie dwie funkcje przeciazane w koncuy w delphi mozna uzywac overload:

function implode(tab: array of Variant; delimiter: string=','): string; overload;

do tej funkcji bedzie przekazywal tablice utworzona dynamnicze bedzie przyjmowala po prostu wskaznik do dowolnego typu:
function implode(tab: PVariant; delimiter: string=','): string; overload;

BTW: Twoj podpis jest dobijajacy ;]

0
Maker napisał(a)

do tej funkcji bedzie przekazywal tablice utworzona dynamnicze bedzie przyjmowala po prostu wskaznik do dowolnego typu:
function implode(tab: PVariant; delimiter: string=','): string; overload;

Spróbujemy...
PROBLEM.

Moja funkcja wygląda tak:

var
 i: integer;
 res: string;
begin
 res:='';

 for i:=low(tab) to high(tab) do
     if i=high(tab) then res:=res+varToStr(tab[i])
        else res:=res+varToStr(tab[i])+delimiter;

 result:=res;
end;

I jest błąd już w wywołaniu pętli. Incompatible types.
Kombinowałem oczywiście ze znaczkami ^ i @, ale nic to nie dało.
Jak to poprawić?

BTW: Twoj podpis jest dobijajacy ;]

Ale podnosi na duchu, nie? :)

0
type
  TExplodeArray = array of String;

{...}

function Implode(const cSeparator: String; const cArray: TExplodeArray): String;
var
  i: Integer;
begin
  Result := '';
  for i := 0 to Length(cArray) -1 do begin
    Result := Result + cSeparator + cArray[i];
  end;
  System.Delete(Result, 1, Length(cSeparator));
end;

function Explode(const cSeparator, vString: String): TExplodeArray;
var
  i: Integer;
  S: String;
begin
  S := vString;
  SetLength(Result, 0);
  i := 0;
  while Pos(cSeparator, S) > 0 do begin
    SetLength(Result, Length(Result) +1);
    Result[i] := Copy(S, 1, Pos(cSeparator, S) -1);
    Inc(i);
    S := Copy(S, Pos(cSeparator, S) + Length(cSeparator), Length(S));
  end;
  SetLength(Result, Length(Result) +1);
  Result[i] := Copy(S, 1, Length(S));
end;
0

Do tego lepiej się nadaje TStringList.

0

Czy mi się wydaje, czy w FAQ do Delphi jest opisane jak zrobić odpowiednik implode i explode z PHP?

1 użytkowników online, w tym zalogowanych: 0, gości: 1