Du må være registrert og logget inn for å kunne legge ut innlegg på freak.no
X
LOGG INN
... eller du kan registrere deg nå
Dette nettstedet er avhengig av annonseinntekter for å holde driften og videre utvikling igang. Vi liker ikke reklame heller, men alternativene er ikke mange. Vær snill å vurder å slå av annonseblokkering, eller å abonnere på en reklamefri utgave av nettstedet.
  14 1618

Kode

foreach($abg as $value){
     $te .= "$value, ";
 }

HTML-kode

Dette blir printa ut slik:

info, 234234, dsfdsf, sfsdf, 23422,
Hvordan kan jeg fjerne siste komma bak 23422 i loopen?

nvm, fant det ut
Kanskje du kan dele løsningen med oss andre sånn at viss noen andre lurer på det samme så slipper de å starte en ny tråd siden det ikke er noen løsning her
Sitat av terminat Vis innlegg

Kode

foreach($abg as $value){
     $te .= "$value, ";
 }

HTML-kode

Dette blir printa ut slik:

info, 234234, dsfdsf, sfsdf, 23422,
Hvordan kan jeg fjerne siste komma bak 23422 i loopen?

nvm, fant det ut
Vis hele sitatet...
fjern kommaet i value.
For the record, her er min løsning hvertfall:

Kode

foreach($abg as $value){ 
     $te .= "$value, "; 
} 
// Substr-funksjonen fjerner de to siste tegnene i stringen etter loopen er ferdig.
$te = substr($te, 0, -2);
Sitat av cmoen11 Vis innlegg
fjern kommaet i value.
Vis hele sitatet...
Han vil kun ha fjernet kommaet siste gang loopen kjøres
Trådstarter
Sitat av Toak Vis innlegg
For the record, her er min løsning hvertfall:

Kode

foreach($abg as $value){ 
     $te .= "$value, "; 
} 
// Substr-funksjonen fjerner de to siste tegnene i stringen etter loopen er ferdig.
$te = substr($te, 0, -2);
Vis hele sitatet...
Jupp, akkuratt dette jeg gjorde. Beklager at jeg ikke delte det med en gang jeg fant det ut.
Hei.

Mulig jeg er litt sær, men jeg ville heller løst det i løkka.

Ville også skrevet det såpass generelt at metoden tar høyde for:
  • Listen kan være null
  • Listen kan være tom
  • Listen kan inneholde elementer som er null
  • Listen kan inneholde elementer som er blanke

Kjapp test i Java gir noe ala:

Kode

 public String listToCommaSeparatedValues(List<String> myList) {
        if (myList == null || myList.isEmpty()) {  // If list is null or empty, just return an empty String.
            return "";
        }

        String outString = "";
        for (Iterator<String> stringIterator = myList.iterator(); stringIterator.hasNext(); ) {
            final String oneStringInList = stringIterator.next();

            if (oneStringInList != null && !"".equals(oneStringInList)) {
                outString += oneStringInList;

                if (stringIterator.hasNext()) {
                    outString += ", ";
                }
            }
        }

        return outString;
    }
Kan sikkert skrives enda bedre, men da vil det fungere selv om listen ser sånn ut:

Kode

 List<String> myList = new ArrayList<String>();
        myList.add("Say");
        myList.add(null);
        myList.add("Hello");
        myList.add("");
        myList.add("World");
Output fra dette eksempelet er:

Say, Hello, World

Hva som er best kan man sikkert diskutere i det evige, men synes dette er en 'riktig' måte å gjøre det på.
Sist endret av pax2k; 20. juli 2012 kl. 21:20.
Sitat av terminat Vis innlegg

Kode

foreach($abg as $value){
     $te .= "$value, ";
 }

HTML-kode

Dette blir printa ut slik:

info, 234234, dsfdsf, sfsdf, 23422,
Hvordan kan jeg fjerne siste komma bak 23422 i loopen?

nvm, fant det ut
Vis hele sitatet...
Det er ikke slikt det skal gjøres i PHP. Dette er hvordan det skal gjøres:

Kode

$te = implode(', ', $abg);
Sist endret av d-_-b; 20. juli 2012 kl. 21:32.
Sitat av pax2k Vis innlegg
Hei.

Mulig jeg er litt sær, men jeg ville heller løst det i løkka.

Ville også skrevet det såpass generelt at metoden tar høyde for:
  • Listen kan være null
  • Listen kan være tom
  • Listen kan inneholde elementer som er null
  • Listen kan inneholde elementer som er blanke

Kjapp test i Java gir noe ala:

Kode

 public String listToCommaSeparatedValues(List<String> myList) {
        if (myList == null || myList.isEmpty()) {  // If list is null or empty, just return an empty String.
            return "";
        }

        String outString = "";
        for (Iterator<String> stringIterator = myList.iterator(); stringIterator.hasNext(); ) {
            final String oneStringInList = stringIterator.next();

            if (oneStringInList != null && !"".equals(oneStringInList)) {
                outString += oneStringInList;

                if (stringIterator.hasNext()) {
                    outString += ", ";
                }
            }
        }

        return outString;
    }
Kan sikkert skrives enda bedre, men da vil det fungere selv om listen ser sånn ut:

Kode

 List<String> myList = new ArrayList<String>();
        myList.add("Say");
        myList.add(null);
        myList.add("Hello");
        myList.add("");
        myList.add("World");
Output fra dette eksempelet er:

Say, Hello, World

Hva som er best kan man sikkert diskutere i det evige, men synes dette er en 'riktig' måte å gjøre det på.
Vis hele sitatet...
Du er ikkje alene om å ville løse den i loopen.

Kode

if (isset ($komma))
{
  unset ($komma);
}

foreach ($array as $value)
{
  if (isset ($komma) && $komma == true) $te .= ",";

  $te .= $value;
  $komma = true;
}
Første loopen vil jo ikkje $komma være TRUE, så da skriver den ingen komma, men fra andre runde så vil $komma være TRUE, å da skriver den "," foran hver $value verdi.

EDIT: Den første IF-setningen er kun til hvis du har kjørt loopen før.
Sist endret av 0xFF; 20. juli 2012 kl. 21:36.
Sitat av pax2k Vis innlegg
Hei.

Mulig jeg er litt sær, men jeg ville heller løst det i løkka.

...

Hva som er best kan man sikkert diskutere i det evige, men synes dette er en 'riktig' måte å gjøre det på.
Vis hele sitatet...
"Riktig" ville jeg ikke sagt. Det er helt klart én måte å gjøre det på, men i forhold til løsningen som kapper av koma i etterkant har koden din to problemer:
  1. Den er vanskeligere å forstå
  2. Den har dårligere kjøretid

Normalt skriver vi kode som er optimalisert for enten lesbarhet (1) eller hastighet (2), eller vi forsøker å kode slik at begge deler blir bra. Forsøk å ikke ta dette som negativ kritikk - all kode kan forbedres, å suboptimal kode er noe man kan lære mye av.

En ting man bør se opp for er strengsammenslåing i løkker. Funksjonen din har dobbelt så mange sammenslåinger som sammenligningsgrunnlaget. Du har også en rekke tester du gjør for hvert element i løkken, og det tar også tid. Alt dette har lite betydning for små lister, men forskjellen blir betydelig når listen er større.

Når det er sagt så vil du nok bruke implode, som ble foreslått. Det er viktig å lære seg biblotekene i språket du bruker, fordi koden blir enklere, fordi man løser problemer raskere, og fordi de "innebygde" funksjonene ofte er optimalisert i forhold til hva man gjør selv.
Sitat av tormaroe Vis innlegg
..............
Normalt skriver vi kode som er optimalisert for enten lesbarhet (1) eller hastighet (2), eller vi forsøker å kode slik at begge deler blir bra. Forsøk å ikke ta dette som negativ kritikk - all kode kan forbedres, å suboptimal kode er noe man kan lære mye av.
.......
Vis hele sitatet...
Hei, igjen.

Jeg tar dette på ingen måte som kritikk, og er helt enig i at man kan lære mye av suboptimal kode!

Jeg er også fult klar over at String-manipulering er overraskende tregt, men siden koden uansett skulle brukes i PHP tenkte jeg at det ble enklest å lese dersom man holdt seg til String.

Nå er jo egentlig problemet til trådstarter løst, men jeg vil gjerne fortsette diskusjonen med en liten oppdatering av koden.

Hva synes du om denne:

Kode

  public String listToCommaSeparatedValues2(List<String> myList) {
        if (myList == null || myList.isEmpty()) {
            return "";
        }

        StringBuilder builder = new StringBuilder(myList.size());
        for (String stringElement : myList) {
            builder.append(stringElement);
            builder.append(", ");
        }

        final int lastIndexOfComma = builder.lastIndexOf(",");

        return builder.substring(0, lastIndexOfComma );
    }
En (muligens) ulempe er at Strings i lista som er null eller "" ikke blir håndtert. Men på en annen side gjør metoden kun "det den skal gjøre".

Dette medfører at:

Kode

 List<String> myList = new ArrayList<String>();
        myList.add("Say");
        myList.add(null);
        myList.add("Hello");
        myList.add("");
        myList.add("World");
Gir følgende resultat: Say, null, Hello, , World.

Men hvor mye man vil sjekke på null/blank er jo avhengig av hva man forventer å få inn, hva som skal ut...

Happy coding!
pax2k
Sitat av pax2k Vis innlegg
Hei, igjen.
Hva synes du om denne:

Kode

  public String listToCommaSeparatedValues2(List<String> myList) {
        if (myList == null || myList.isEmpty()) {
            return "";
        }

        StringBuilder builder = new StringBuilder(myList.size());
        for (String stringElement : myList) {
            builder.append(stringElement);
            builder.append(", ");
        }

        final int lastIndexOfComma = builder.lastIndexOf(",");

        return builder.substring(0, lastIndexOfComma );
    }
Vis hele sitatet...
Du har gått over til StringBuilder, som er bedre. Og du kapper av etter loopen, som er bedre enn å gjøre tester for hvert element. Ok.

Men koden er veldig imperativ, og lite elegant. Dette er en ypperlig anledning til å trekke frem min gode venn reduce - også kjent som fold, aggregate, accumulate, compress og inject - og en nær venn av PHP's implode som ble nevnt i denne tråden. Hva med denne lille C#-metoden:

Kode

  public static string ToCommaSeparatedValues(
      this IEnumerable<string> elements)
  { 
    if (elements.Count() == 0) return "";
    return elements.Aggregate(
        (acc, elem) => string.Format("{0}, {1}", acc, elem));
  }
Disse to linjen gjør samme jobben som du gjorde. Jeg kan kjøre på en tom liste:

Kode

    var emptyList = new string[]{ };
    Console.WriteLine(emptyList.ToCommaSeparatedValues());
.. og programmet skriver ut en tom linje. Jeg kan kjøre på en liste med ett element:

Kode

    var oneElement = new string[]{"foobar"};
    Console.WriteLine(oneElement.ToCommaSeparatedValues());
.. og programmet skriver kun ut foobar. Eller jeg kan kjøre på en lengre liste:

Kode

    var severalElement = new string[]{"foo", "bar", "zot"};
    Console.WriteLine(severalElement.ToCommaSeparatedValues());
.. og output blir: foo, bar, zot. Ingen behov for å håndtere noe hengende komma her altså.

Jeg har skrevet flere blogposter om reduce og andre funksjoner fra den funksjonelle paradigmen. Et sted å starte for dem som ikke har vært eksponert for dette tidligere er posten filtrer, projiser, aggreger. I min ferskeste post - Den lille Erlanger - forsøker jeg å gå fra null kunnskap om et programmeringsspråk til å vise både hvordan man bruker og hvordan man implementerer reduce, og hvorfor det er et så kraftig konsept.
Sist endret av tormaroe; 21. juli 2012 kl. 23:22.
▼ ... over en måned senere ... ▼
Sorry ass, men alle løsningene deres ska da være så håpløst avanserte! xD

Kode

$forst = true;
foreach($abg as $value){
     if($forst == true) {
          $forst = false;
          $te .= "$value";
     } else {
          $te .= ", $value";
     }
}
Sitat av aragagg Vis innlegg
Sorry ass, men alle løsningene deres ska da være så håpløst avanserte! xD
[/code]
Vis hele sitatet...
Min løsning er ikke mer avansert enn din, snarere tvert i mot Den er nok bare uvandt for utviklere som er mest komfortable med imperativ programmering, og ikke kjenner så godt til lambda-uttrykk og høyere-ordens funksjoner.

I funksjonelle språk, som f.eks. Clojure, er min løsning ganske så enkel:

Kode

(reduce #(str %1 ", " %2) the-list)
mens løsningen din nesten er umulig å få til - d.v.s. språket gjør det vanskelig med overlegg:

Kode

(let [first (atom true)
      result (atom "")]
  (doseq [value the-list]
    (if @first
      (do
        (swap! first not)
        (swap! result str value))
      (swap! result str ", " value)))
  @result)
Sorry ass, men alle løsningene deres ska da være så håpløst avanserte! xD
Vis hele sitatet...
Har du lest tråden når ble implode(', ', $abg); avansert?,postet av @d-_-b.
implode() er den mest naturlige løsning i php,det samme som bruk av join() i andre språk som python,ruby,perl,javascript.

Kode

#python
>>> ', '.join(["foo", "bar", "zot"])
'foo, bar, zot'
Ville også skrevet det såpass generelt at metoden tar høyde for:
  • Listen kan være null
  • Listen kan være tom
  • Listen kan inneholde elementer som er null
  • Listen kan inneholde elementer som er blanke
Vis hele sitatet...
Ohh viss noen er i tvil listToCommaSeparatedValues forklarealtietord
For og følge kravene dine.

Kode

#python
>>> lst = ["foo", "bar", '', None, "zot"]
>>> ', '.join(i for i in lst if i)
'foo, bar, zot'
(i for i in lst if i) retunerer generator expression object,som blir kjøre når jeg bruker join().
Sist endret av snippsat; 24. august 2012 kl. 16:08.