Project

General

Profile

1
<?php
2

    
3
/*
4
 * This file is part of Twig.
5
 *
6
 * (c) 2009 Fabien Potencier
7
 *
8
 * For the full copyright and license information, please view the LICENSE
9
 * file that was distributed with this source code.
10
 */
11
class Twig_Node_Expression_Array extends Twig_Node_Expression
12
{
13
    protected $index;
14

    
15
    public function __construct(array $elements, $lineno)
16
    {
17
        parent::__construct($elements, array(), $lineno);
18

    
19
        $this->index = -1;
20
        foreach ($this->getKeyValuePairs() as $pair) {
21
            if ($pair['key'] instanceof Twig_Node_Expression_Constant && ctype_digit((string) $pair['key']->getAttribute('value')) && $pair['key']->getAttribute('value') > $this->index) {
22
                $this->index = $pair['key']->getAttribute('value');
23
            }
24
        }
25
    }
26

    
27
    public function getKeyValuePairs()
28
    {
29
        $pairs = array();
30

    
31
        foreach (array_chunk($this->nodes, 2) as $pair) {
32
            $pairs[] = array(
33
                'key' => $pair[0],
34
                'value' => $pair[1],
35
            );
36
        }
37

    
38
        return $pairs;
39
    }
40

    
41
    public function hasElement(Twig_Node_Expression $key)
42
    {
43
        foreach ($this->getKeyValuePairs() as $pair) {
44
            // we compare the string representation of the keys
45
            // to avoid comparing the line numbers which are not relevant here.
46
            if ((string) $key == (string) $pair['key']) {
47
                return true;
48
            }
49
        }
50

    
51
        return false;
52
    }
53

    
54
    public function addElement(Twig_Node_Expression $value, Twig_Node_Expression $key = null)
55
    {
56
        if (null === $key) {
57
            $key = new Twig_Node_Expression_Constant(++$this->index, $value->getLine());
58
        }
59

    
60
        array_push($this->nodes, $key, $value);
61
    }
62

    
63
    public function compile(Twig_Compiler $compiler)
64
    {
65
        $compiler->raw('array(');
66
        $first = true;
67
        foreach ($this->getKeyValuePairs() as $pair) {
68
            if (!$first) {
69
                $compiler->raw(', ');
70
            }
71
            $first = false;
72

    
73
            $compiler
74
                ->subcompile($pair['key'])
75
                ->raw(' => ')
76
                ->subcompile($pair['value'])
77
            ;
78
        }
79
        $compiler->raw(')');
80
    }
81
}
(1-1/18)