A Lattice class

Written by Ben Wendt

Consider if you need a 7-dimensional lattice data structure. An array is great for one-dimensional data but once you add dimensions things quickly get difficult to manage. Here’s a data structure that takes away some of that headache:

<?php

class Lattice {

    private $lattice = null;
    private $dimensions = 0;
    private $boundaries = null;

    public function setDimensions($d) {
        if (is_integer($d)) {
            $this->dimensions = $d;
        } else {
            throw new Exception('setDimensions expects an integer. given: ' . $d);
        }
    }
    public function getDimensions() {
        return $this->dimensions;
    }
    public function setBoundaries(array $boundaries) {
        $iteration = count($boundaries);
        if ($this->dimensions > 0 && $this->dimensions == count($boundaries)) {
            $this->boundaries = $boundaries;
            $array = null;
            while ($iteration > 0) {
                $iteration --;
                $array = array_fill(0, $boundaries[$iteration], $array);
            }
            $this->lattice = $array;
        } else {
            throw new Exception("Boundary count should match dimension count");
        }
    }
    public function setNode(array $coordinates, $value) {
        if (count($coordinates) != $this->dimensions) {
            throw new Exception("Passed coordinates have dimension mismatch");
        }
        $iteration = 0;
        $array = &$this->lattice;
        while ($iteration < count($coordinates) - 1) {
            $coordinate = $coordinates[$iteration];

            if ($coordinate > $this->boundaries[$iteration] - 1) {
                throw new Exception("coordinate $iteration is out of bounds");
            }
            $array = &$array[$coordinate];
            $iteration++;
        }
        $coordinate = $coordinates[$iteration];
        if ($coordinate > $this->boundaries[$iteration] - 1) {
            throw new Exception("coordinate $iteration is out of bounds");
        }
        $array[$coordinate] = $value;
    }
    public function getNode(array $coordinates) {
        if (count($coordinates) != $this->dimensions) {
            throw new Exception("Passed coordinates have dimension mismatch");
        }
        $iteration = 0;
        $array = &$this->lattice;
        while ($iteration < count($coordinates) - 1) {
            $coordinate = $coordinates[$iteration];

            if ($coordinate > $this->boundaries[$iteration] - 1) {
                throw new Exception("coordinate $iteration is out of bounds");
            }
            $array = &$array[$coordinate];
            $iteration++;
        }
        $coordinate = $coordinates[$iteration];
        if ($coordinate > $this->boundaries[$iteration] - 1) {
            throw new Exception("coordinate $iteration is out of bounds");
        }
        return $array[$coordinate];
    }
    public function toArray() {
        return $this->lattice;
    }
}