2013-03-25 13 views
6

Jeśli mam tablicę php tak:Węzeł PHP. Niejawna iterator: Jak dostać klucz od wartości prądu (numeryczny tablicy PHP)

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

i klucze obecny ważna informacja - może to być pewne stałe wartości, identyfikatory itp

Więc jak mogę uzyskać klucz bieżącego elementu z templete. Na przykład:

{{#data}} 

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

{{/data}} 

W naszym systemie zbyt wiele tego rodzaju tablic i jest niewygodnie, zanim ponownie przetworzyć je. Jakie jest lepsze rozwiązanie? Dziękuję bardzo!

Odpowiedz

7

Nie można wykonywać iteracji na tablicy asocjacyjnej w wąsach, ponieważ wąsy są postrzegane jako "hash", a nie jako lista iterowalna. I nawet jeśli mógłbyś powtórzyć listę, nie byłbyś w stanie uzyskać dostępu do kluczy.

W tym celu należy przygotować swoje dane. Możesz to zrobić za pomocą pętli foreach, zanim przekażesz dane do wąsów, lub możesz to zrobić, owijając tablicę w "Presenter". Coś jak to powinno załatwić sprawę:

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

Następnie wystarczy owinąć tablicę w Presenter:

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

mieć teraz dostęp do kluczy i wartości podczas iteracji nad danymi:

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

Wielkie dzięki dla klasy. Przetestowałem to i używam go teraz w stabilnym środowisku na żywo. Działa w porządku. –

3

Uwielbiam wąsy. Podczas nauki znalazłem to pytanie i poczułem, że potrzebuje odpowiedniej odpowiedzi.

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

Wtedy można go użyć w szablonie tak:

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

ten może być rozszerzony o wiele dalej niż klucz/Val dodając więcej wartości w pętli foreach.

Powiązane problemy