2016-03-23 15 views
3

Ben bir foreach döngü yapıyorum ve yineleme sonuncu değilse gibi bir mantık yapmak gerekir. Fiyatları topla. yineleme son olduğunda. toplanan fiyatlar ile toplamdan çıkar. son iterasyon fiyatı hariç. Aşağıdaki kodu aldım. ama işe yaramıyor.Son yineleme dışında foreach döngüsünde bir şeyler belirleme ve yapma

$i = 0; 
    $credit = ''; 
    $count = count($reslist); 

    foreach ($reslist as $single_reservation) { 
      //All of the transactions to be settled by course 
      //$credit    = $this->Reservations_model->find_res_price($single_reservation['value']) * $this->input->post('currency_value'); 

      if ($i > $count && $single_reservation != end($reslist)) { 
       $gather_sum_in_czk += $this->Reservations_model->find_res_price($single_reservation['value']) * $this->input->post('currency_value'); 
       $credit    = $this->Reservations_model->find_res_price($single_reservation['value']) * $this->input->post('currency_value'); 
      } 
      //Last iteration need to subtract gathered up sum with total. 
      else { 
       $credit = $suminczk - $gather_sum_in_czk; 
      } 
    $i++; 
    } 

DÜZENLEME: TÜM ETKİLEŞİMLERİ Execpt LAST İÇİN FİYATLAR olarak toplamak için çalışırken:

  if ($i != $count - 1 || $i !== $count - 1) { 
       $gather_sum_in_czk += $this->Reservations_model->find_res_price($single_reservation['value']) * $this->input->post('currency_value'); 
       $credit    = $this->Reservations_model->find_res_price($single_reservation['value']) * $this->input->post('currency_value'); 
      } 

      else { 
       $credit = $suminczk - $gather_sum_in_czk; 
      } 
+2

Sayaçınız '$ i' ve' $ count' içinde toplam sayımınız var, bu yüzden mutlaka bir 'if ($ i == $ counter) {}' sonuncuyu yakalayacak mı? – Egg

+0

İlk döngüde '$ i> $ count' üzerinde, $ i, 0, dolayısıyla, $ sayısından daha büyük nasıl olabilir? –

+0

Düzenleme bölümüne bakın. İlk önce tüm süreyi topladım. Ardından, $ dizini için son – Prague2

cevap

1

SPL CachingIterator bir unsuru arkasında her zaman onun iç iterator. Bu nedenleyoluyla sonraki elemanı üretecek olmadığını rapor edebilirsiniz.
Örnek için, bu yaklaşımın örn. saymak ($ ​​dizi).

<?php 
// see http://docs.php.net/CachingIterator 
//$cacheit = new CachingIterator(new ArrayIterator(range(1,10))); 
$cacheit = new CachingIterator(gen_data()); 

$sum = 0;     
foreach($cacheit as $v) { 
    if($cacheit->hasNext()) { 
     $sum+= $v; 
    } 
    else { 
     // ...and another operation for the last iteration 
     $sum-=$v; 
    } 
} 

echo $sum; // 1+2+3+4+5+6+7+8+9-10 = 35 


// see http://docs.php.net/generators 
function gen_data() { 
    foreach(range(1,10) as $v) { 
     yield $v; 
    } 
} 
0

foreach PHP'de bir dizi -Ing anahtarı (tamsayı endeksi ise saf dizi) hem döner ve değer. Aşağıdaki yapıyı kullanmak, değeri kullanmak edebilmek için:

sonra
foreach ($array as $key => $value) { 
... 
} 

Eğer $key >= count($array) - 1 (0 tabanlı dizide hatırlamak olmadığını kontrol edebilirsiniz, son öğe count($array) - 1 olduğunu

Orijinal kod neredeyse çalışır. , if durumda sadece yanlış. $i > $count yerine $i >= $count - 1 kullanın.

+0

Sadece tuşlarını kullanmak, dizi anahtarları için sayısal dizinlenmiş değerler kullanırsanız çalışır. Prag @, dizinin nasıl oluşturulduğunu veya doldurulduğunu göstermediği için, bu biraz bir varsayımdır. '$ I' sayacını kullanmak daha güvenilirdir. –

+0

Dizimdeki anahtarlar ve değerler sadece sayısal değil – Prague2

+0

Anahtarlar için bir varsayım var. Bununla birlikte, son paragraf geçerlidir. – LeleDumbo

İlgili konular