Bir foreach döngüsü kullanmak, ancak son tekrarında farklı bir şey yapmak nasıl?

7 Cevap

Bu muhtemelen basit bir soru, ama nasıl sonuncusu kadar, her biri için bir şey yapıyor, bir dizi yineleme ve farklı bir şey yapmak istiyorsun?

Ben isimleri bir dizi var. Ben çıktı virgülle ayırarak adlarının listesini istiyorum.

Joe Bob, Falanca

Ben dizideki soyadının sonuna bir virgül istiyorum, ne de bir tek dizide değeri varsa (ya da hiçbiri!).

Ben her nesneden adı almak kullanıcı modeli nesneleri bir dizi var çünkü Update: I implode() kullanamazsınız.

$users = array();
$users[] = new User();

foreach ($users as $user) {
    echo $user->name;
    echo ', ';
}

Bunu nasıl ulaşmak ve hala bu nesneleri kullanabilirsiniz?

Update: benim görünümü komut koyarak kaç satır kod hakkında çok fazla endişe, bu yüzden onun yerine bir görünüm bir yardımcı yaratmaya karar verdi. Burada ben ile sona ne:

$array = array();
foreach($users as $user) {
    $array[] = $user->name;
}
$names = implode(', ', $array);

7 Cevap

Kullan implode:

$names = array('Joe', 'Bob', 'Foobar');
echo implode(', ', $names); # prints: Joe, Bob, Foobar

Dizideki tek bir nesne varsa, açıklığa kavuşturmak için, ', ' ayırıcı olarak kullanılan tüm olmayacak ve tek bir öğe içeren bir dize döndürülür.

Nesnelerin bir dizi var ve testleri ile bir for döngü dışında bir şekilde bunu yapmak isteseydi EDIT:, bunu yapabilirsiniz:

function get_name($u){ return $u->name; };
echo implode(', ', array_map('get_name', $users) ); # prints: Joe, Bob, Foobar
$array = array('joe', 'bob', 'Foobar');
$comma_separated = join(",", $array);

çıkışı:

joe,bob,Foobar

implode(', ', $array_of_names)

psuedocode ....

integer sigh=container.getsize();
sigh--;
integer gosh=0;
foreach element in container
{
  if(gosh!=sigh)
    dosomething();
  else 
    doLastElementStuff();
  gosh++;
}

D: Tüm diğer cevaplara bakarak, ben geçen o şey yazdı beri PHP çok daha sözdizimsel S aldı görünüyor

Ben bu çok yapı SQL ifadeleri vb rastlamak

$joiner = " ";
foreach ($things as $thing) {
    echo "  $joiner $thing \n";
    $joiner = ',';
}

Eğer "," düşünüyorum "VE" ya da "VEYA" bir öğe önce gider bir seçenek / nitelik olarak. Eğer nedense en kolay mantığını çalışmak Sorun o ilk satırda üzerinde "," bastırmak için nasıl olur.

Ben şahsen (eğer mikro optimizasyonu içine iseniz) en hızlı yolunu buldu:

  if(isset($names[1])) {
     foreach ($names as $name) {
       $result .= $name . ', ';
    }
    $result = substr($result, 0, -2);
  } else {
    $result = $names[0];
  }

isset($names[1]) bir dizi (veya dize) uzunluğunu kontrol yolu (çok net olmasa da) hızlı. Bu durumda, en az iki eleman kontrol gerçekleştirilir.

Ben aslında daha kolay biraz farklı benim virgülle ayrılmış metin oluşturmak için bulabilirsiniz. Biraz daha söz, ama o daha az işlev çağrıları bulunuyor.

<?php
$nameText = "";
for ($i = 0; $i < count($nameArray); $i++) {
if ($i == 0) {
$nameText = $nameArray[$i];
}
else {
$nameText .= "," . $nameArray[$i];
}
}

Bu dizi eğer ilk elemanı nerede dışında her isim için bir önek olarak virgül ekler. Ben mevcut dizin ve bir dizi nedenle bitişik elemanlarına kolay erişim beri for foreach karşıt olarak kullanarak düşkün büyüdü. Sen foreach şöyle kullanabilirsiniz:

<?php
$nameText = "";
$nameCounter = 0;
for ($nameArray as $thisName) {
if ($nameCounter == 0) {
$nameText = $thisName;
$nameCounter++;
}
else {
$nameText .= "," . $thisName;
}
}