2013-03-25 142 views
6

的關鍵。如果我有PHP數組是這樣的:PHP鬍子。隱迭代器:如何獲得電流值(數字的PHP數組)

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

和密鑰目前重要的信息 - 它可以是一些常數值,IDS等

那麼我怎麼才能從模板中獲取當前元素的關鍵字。 例如:

{{#data}} 

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

{{/data}} 

在我們的系統太多這些數組類型,這是令人不安之前重新解析。有什麼更好的解決方案呢? 非常感謝!

回答

7

不可能遍歷Mustache中的關聯數組,因爲Mustache將其視爲「散列」而不是迭代列表。即使您可以遍歷列表,您也無法訪問密鑰。

爲了做到這一點,您必須準備好您的數據。在將數據傳遞到Mustache之前,您可以通過foreach循環來完成,或者您可以通過將數組包裝到「Presenter」中來完成。像這樣的東西應該做的伎倆:

<?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); 
    } 
} 

然後簡單包裝您的數組中的主講人:

$view['data'] = new IteratorPresenter($view['data']); 

您現在可以訪問鍵和值在遍歷數據:

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

非常感謝這門課程。我測試了它,並在穩定的現場環境中使用它。工作正常。 – 2014-06-24 09:43:43

3

我愛鬍子。在學習時我發現了這個問題,並且覺得需要一個合適的答案。通過在foreach循環中添加更多的值

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

這遠遠超出鍵/纈氨酸擴展:

$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); 

然後你就可以在你的模板中使用它像這樣。