2013-03-25 40 views
6

Nếu tôi có mảng php như thế này:Moustache PHP. iterator ngầm: Làm thế nào để có được chìa khóa của giá trị hiện tại (php mảng số)

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

Và phím hiện thông tin quan trọng - Có thể có một số giá trị không đổi, id vv

Sau đó, làm thế nào tôi có thể lấy chìa khóa của phần tử hiện tại từ templete. Ví dụ:

{{#data}} 

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

{{/data}} 

Trong hệ thống của chúng tôi quá nhiều các loại mảng và nó là khó chịu tái phân tích chúng trước. Giải pháp tốt hơn cho việc này là gì? Cảm ơn bạn rất nhiều!

Trả lời

7

Không thể lặp qua một mảng liên kết trong Mustache, vì Mustache xem nó như là một "băm" chứ không phải là danh sách có thể lặp lại được. Và ngay cả khi bạn có thể lặp qua danh sách, bạn sẽ không thể truy cập các phím.

Để thực hiện việc này, bạn phải chuẩn bị dữ liệu của mình. Bạn có thể làm điều đó với một vòng lặp foreach trước khi bạn chuyển dữ liệu vào Mustache, hoặc bạn có thể làm điều đó bằng cách gói mảng của bạn trong một "Người trình bày". Một cái gì đó như thế này nên làm các trick:

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

Sau đó chỉ cần quấn mảng của bạn trong Presenter:

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

Bây giờ bạn có quyền truy cập vào các phím và các giá trị trong khi iterating trên dữ liệu của bạn:

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

Cảm ơn rất nhiều về lớp học. Tôi đã thử nghiệm nó và sử dụng nó ngay bây giờ trong một môi trường sống ổn định. Hoạt động tốt. –

3

Tôi yêu bộ ria mép. Trong khi học tôi tìm thấy câu hỏi này và cảm thấy nó cần một câu trả lời thích hợp.

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

Sau đó, bạn có thể sử dụng nó trong mẫu của bạn như sau:

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

này có thể được mở rộng nhiều hơn nữa so với chính/Val bằng cách thêm nhiều giá trị trong vòng lặp foreach.

Các vấn đề liên quan