PHP Mustache. Implicit iterator: How to get key of current value(numeric php array)

依然范特西╮ 提交于 2019-12-07 01:02:39

问题


If I have php array like this:

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

And keys present important information - It can be some constant values, ids e.t.c

Then how can I get key of current element from templete. For example:

{{#data}}

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

{{/data}}

In our system too much these kind of arrays and it is uncomfortably re-parse them before. What's better solution for this? Thank you very much!


回答1:


It is not possible to iterate over an associative array in Mustache, because Mustache sees it as a "hash" rather than an iterable list. And even if you could iterate over the list, you would not be able to access the keys.

In order to do this, you must prepare your data. You could do it with a foreach loop before you pass the data into Mustache, or you could do it by wrapping your array in a "Presenter". Something like this ought to do the 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);
    }
}

Then simply wrap your array in the Presenter:

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

You now have access to the keys and values while iterating over your data:

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



回答2:


I love mustache. While learning I found this question and felt it needed an appropriate answer.

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

Then you can use it in your template like so:

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

This can be expanded much further than Key/Val by adding more values in the foreach loop.



来源:https://stackoverflow.com/questions/15613903/php-mustache-implicit-iterator-how-to-get-key-of-current-valuenumeric-php-arr

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!