2013-03-25 8 views
6

Wenn ich PHP-Array wie dieses:PHP Schnurrbart. Implizite Iterator: Wie Schlüssel des aktuellen Wertes bekommen (numerisch PHP-Array)

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

und Schlüssel vorhanden wichtige Informationen - Es kann einige konstante Werte sein, ids etc

Dann wie bekomme ich Schlüssel des aktuellen Elements von tempelte. Zum Beispiel: vor

{{#data}} 

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

{{/data}} 

In unserem System zu viel diese Art von Arrays und es ist ihnen unangenehm wieder zu analysieren. Was ist die bessere Lösung dafür? Vielen Dank!

Antwort

7

Es ist nicht möglich, über ein assoziatives Array in Moustache zu iterieren, da es von Moustache als "Hash" und nicht als iterierbare Liste betrachtet wird. Und selbst wenn Sie über die Liste iterieren könnten, wären Sie nicht in der Lage, auf die Schlüssel zuzugreifen.

Um dies zu tun, müssen Sie Ihre Daten vorbereiten. Sie können dies mit einer foreach-Schleife tun, bevor Sie die Daten in Moustache übergeben, oder Sie können es tun, indem Sie Ihr Array in einen "Presenter" einschließen. So etwas wie dies tun sollte den Trick: haben

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

Sie nun Zugriff auf die Schlüssel und Werte, während sie über Ihre Daten zu iterieren:

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

Dann einfach wickeln Sie Ihre Array in der Presenter

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

Vielen Dank für die Klasse. Ich habe es getestet und benutze es jetzt in einer stabilen Live-Umgebung. Funktioniert gut. –

3

Ich liebe Schnurrbart. Während des Lernens fand ich diese Frage und fühlte, dass sie eine angemessene Antwort benötigte.

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

Dann können Sie es in Ihrer Vorlage verwenden wie so:

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

Dies erweitert werden kann viel weiter als Key/Val um mehr Werte in der foreach-Schleife hinzufügen.