2013-03-25 18 views
6

anahtarını almak için:PHP Bıyık. Örtülü yineleyici: Böyle php dizi varsa akım değeri (sayısal php dizisi)

$a = array (
    99 => 'Something1', 
    184 => 'Something2', 
); 

Ve tuşlar mevcut önemli bilgiler - O bazı sabit değerler olabilir kimlikleri vb

Ardından mevcut öğenin anahtarını templete nasıl alabilirim. Dizilerin çok fazla bu tür bizim sistemde

{{#data}} 

{.} - it is current value, but I need key also. 

{{/data}} 

ve önce onları yeniden ayrıştırmak rahatsızca: Örneğin . Bunun için daha iyi bir çözüm nedir? Çok teşekkür ederim!

cevap

7

Bıyık'ta ilişkisel bir dizi üzerinde yineleme yapmak mümkün değildir, çünkü Bıyık bunu yinelenebilir bir liste yerine bir “karma” olarak görür. Ve listenin üzerinde yineleyebilirseniz bile, tuşlara erişemezdiniz.

Bunu yapmak için verilerinizi hazırlamanız gerekir. Verileri Bıyık'a geçirmeden önce bir foreach döngüsüyle yapabilirdiniz ya da dizinizi bir "Presenter" 'da sarmalayarak yapabilirsiniz. Böyle bir şey hile yapmak gerektiğini:

<?php 

class IteratorPresenter implements IteratorAggregate 
{ 
    private $values; 

    public function __construct($values) 
    { 
     if (!is_array($values) && !$values instanceof Traversable) { 
      throw new InvalidArgumentException('IteratorPresenter requires an array or Traversable object'); 
     } 

     $this->values = $values; 
    } 

    public function getIterator() 
    { 
     $values = array(); 
     foreach ($this->values as $key => $val) { 
      $values[$key] = array(
       'key' => $key, 
       'value' => $val, 
       'first' => false, 
       'last' => false, 
      ); 
     } 

     $keys = array_keys($values); 

     if (!empty($keys)) { 
      $values[reset($keys)]['first'] = true; 
      $values[end($keys)]['last'] = true; 
     } 

     return new ArrayIterator($values); 
    } 
} 

Sonra sadece Presenter'da dizinizi sarın:

$view['data'] = new IteratorPresenter($view['data']); 
veriler üzerinde yineleme sırasında Artık anahtarlara ve değerlere erişebilir

:

{{# data }} 
    {{ key }}: {{ value }} 
{{/ data }} 
+1

Sınıf için çok teşekkürler. Bunu test ettim ve şimdi sabit bir canlı ortamda kullanıyorum. İyi çalışıyor. –

3

Bıyıkları severim. Öğrenirken bu soruyu buldum ve uygun bir cevaba ihtiyacı olduğunu hissettim.

$this->keyValueArray = Array(
    "key1" => "val1", 
    "key2" => "val2", 
    "key3" => "val3" 
); 

$tempArray = array(); 
foreach($this->keyValueArray as $key=>$val){ 
    $tempArray[] = Array("keyName" => $key, "valName" => $val); 
} 

$this->mustacheReadyData = ArrayIterator($tempArray); 

Sonra şöyle şablonunuzda kullanabilirsiniz:

{{#mustacheReadyData}} 
    Key: {{keyName}} Value: {{valName}} 
{{/mustacheReadyData}} 

Bu Anahtar/Val daha ileri genişletilebilir foreach döngüsünde daha fazla değer ekleyerek.