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 }}
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. –