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