<style>
span {
width: 30px;
border: 1px solid #ccc;
background: #eee;
border-radius: 3px;
display: inline-block;
text-align: center;
font-family: Tahoma;
margin: 1px;
padding: 5px 0;
}
</style>
<?php
class Triangle {
/**
* @var integer
*/
private $levels_count;
/**
* @var array
*/
private $structure = [];
/**
* @var array
*/
private $path = [];
/**
* Class Constuctor.
*
* @param integer $levels_count Count of trianlge levels
*/
public function __construct($levels_count = 3) {
$this->levels_count = $levels_count;
}
/**
* Build the triangle structure
*
* @return Trianlge
*/
public function build() {
for($i = 1; $i <= $this->levels_count; $i++) {
$level = [];
while(true) {
break;
}
$this->structure[] = $level;
}
return $this;
}
/**
* Find the shortest path
*
* @return array
*/
public function findPath() {
$node = 0;
foreach ($this->getStructure() as $level) {
$node = [
'index' => 0,
'value' => $level[0],
];
}
else {
// $slice = ($node['index'] == 0) ? array_slice($level, 0, 2) : array_slice($level, $node['index']-1, 3);
if($node['index'] == 0) {
}
else
echo ' ';
$node = [
];
print_r(' / new index '.$node['index']); echo '<br>';
}
$this->path[] = $node;
}
return $this;
}
/**
* Gets the triangle structure.
*
* @return array
*/
public function getStructure() {
return $this->structure;
}
/**
* Gets the triangle path.
*
* @return array
*/
public function getPath() {
return $this->path;
}
}
$triangle = new Triangle(8);
$triangle->build()->findPath();
echo '<hr>';
foreach ($triangle->getPath() as $node) {
echo $node['value'] . ' + ';
}
echo '<hr>';
foreach ($triangle->getStructure() as $k => $level) {
$current_node = $triangle->getPath()[$k];
echo '<div>';
foreach($level AS $key => $value) {
$class = ($current_node['index'] == $key) ? 'red' : '';
echo '<span style="color:'.$class.'">'.$value.'</span>';
}
echo '</div>';
}
PHN0eWxlPgoJc3BhbiB7CgkJd2lkdGg6IDMwcHg7CgkJYm9yZGVyOiAxcHggc29saWQgI2NjYzsKCQliYWNrZ3JvdW5kOiAjZWVlOwoJCWJvcmRlci1yYWRpdXM6IDNweDsKCQlkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CgkJdGV4dC1hbGlnbjogY2VudGVyOwoJCWZvbnQtZmFtaWx5OiBUYWhvbWE7CgkJbWFyZ2luOiAxcHg7CgkJcGFkZGluZzogNXB4IDA7Cgl9Cjwvc3R5bGU+CgoKPD9waHAKCgpjbGFzcyBUcmlhbmdsZSB7CgogICAgLyoqCiAgICAgKiBAdmFyIGludGVnZXIKICAgICAqLwoJcHJpdmF0ZSAkbGV2ZWxzX2NvdW50OwoKICAgIC8qKgogICAgICogQHZhciBhcnJheQogICAgICovCglwcml2YXRlICRzdHJ1Y3R1cmUgPSBbXTsKCiAgICAvKioKICAgICAqIEB2YXIgYXJyYXkKICAgICAqLwoJcHJpdmF0ZSAkcGF0aCA9IFtdOwoJCiAgICAvKioKICAgICAqIENsYXNzIENvbnN0dWN0b3IuCiAgICAgKgogICAgICogQHBhcmFtIGludGVnZXIgJGxldmVsc19jb3VudCBDb3VudCBvZiB0cmlhbmxnZSBsZXZlbHMKICAgICAqLwoJcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCRsZXZlbHNfY291bnQgPSAzKSB7CgkJJHRoaXMtPmxldmVsc19jb3VudCA9ICRsZXZlbHNfY291bnQ7Cgl9CgoKICAgIC8qKgogICAgICogQnVpbGQgdGhlIHRyaWFuZ2xlIHN0cnVjdHVyZQogICAgICoKICAgICAqIEByZXR1cm4gVHJpYW5sZ2UKICAgICAqLwoJcHVibGljIGZ1bmN0aW9uIGJ1aWxkKCkgewoJCWZvcigkaSA9IDE7ICRpIDw9ICR0aGlzLT5sZXZlbHNfY291bnQ7ICRpKyspIHsKCQkJJGxldmVsID0gW107CgkJICAgIHdoaWxlKHRydWUpIHsgCgkJICAgICAgICAkbGV2ZWxbXSA9IHJhbmQoMCwgOSk7IAoJCSAgICAgICAgJGxldmVsID0gYXJyYXlfdW5pcXVlKCRsZXZlbCk7IAoJCSAgICAgICAgaWYoY291bnQoJGxldmVsKSA9PSAkaSkgCgkJICAgICAgICAgICAgYnJlYWs7IAoJCSAgICB9IAoJCQkkdGhpcy0+c3RydWN0dXJlW10gPSAkbGV2ZWw7CgkJfQoJCXJldHVybiAkdGhpczsKCX0KCgogICAgLyoqCiAgICAgKiBGaW5kIHRoZSBzaG9ydGVzdCBwYXRoCiAgICAgKgogICAgICogQHJldHVybiBhcnJheQogICAgICovCglwdWJsaWMgZnVuY3Rpb24gZmluZFBhdGgoKSB7CgkJJG5vZGUgPSAwOwoJCWZvcmVhY2ggKCR0aGlzLT5nZXRTdHJ1Y3R1cmUoKSBhcyAkbGV2ZWwpIHsKCQkJaWYoY291bnQoJGxldmVsKSA9PSAxKSB7CgkJCQkkbm9kZSA9IFsKCQkJCQknaW5kZXgnID0+IDAsIAoJCQkJCSd2YWx1ZScgPT4gJGxldmVsWzBdLAoJCQkJXTsKCQkJfQoJCQllbHNlIHsKCQkJCS8vICRzbGljZSA9ICgkbm9kZVsnaW5kZXgnXSA9PSAwKSA/IGFycmF5X3NsaWNlKCRsZXZlbCwgMCwgMikgOiBhcnJheV9zbGljZSgkbGV2ZWwsICRub2RlWydpbmRleCddLTEsIDMpOwoJCQkJaWYoJG5vZGVbJ2luZGV4J10gPT0gMCkgewoJCQkJIAkkc2xpY2UgPSBhcnJheV9zbGljZSgkbGV2ZWwsIDAsIDIpOwoJCQkJfQoJCQkJZWxzZQoJCQkJIAkkc2xpY2UgPSBhcnJheV9zbGljZSgkbGV2ZWwsICRub2RlWydpbmRleCddLTEsIDMpOwoKCQkJCXByaW50X3IoJ2luZGV4ICcuJG5vZGVbJ2luZGV4J10pOwoJCQkJZWNobyAnICc7CgkJCQlwcmludF9yKCRzbGljZSk7CgoJCQkJJG5vZGUgPSBbCgkJCQkJJ2luZGV4JyA9PiBhcnJheV9zZWFyY2gobWluKCRzbGljZSksICRsZXZlbCksIAoJCQkJCSd2YWx1ZScgPT4gbWluKCRzbGljZSksCgkJCQldOwoJCQkJcHJpbnRfcignIC8gbmV3IGluZGV4ICcuJG5vZGVbJ2luZGV4J10pOwoJCQkJZWNobyAnPGJyPic7CgkJCX0KCQkJJHRoaXMtPnBhdGhbXSA9ICRub2RlOwoJCX0KCQlyZXR1cm4gJHRoaXM7Cgl9CgoKICAgIC8qKgogICAgICogR2V0cyB0aGUgdHJpYW5nbGUgc3RydWN0dXJlLgogICAgICoKICAgICAqIEByZXR1cm4gYXJyYXkKICAgICAqLwoJcHVibGljIGZ1bmN0aW9uIGdldFN0cnVjdHVyZSgpIHsKCQlyZXR1cm4gJHRoaXMtPnN0cnVjdHVyZTsKCX0KCgogICAgLyoqCiAgICAgKiBHZXRzIHRoZSB0cmlhbmdsZSBwYXRoLgogICAgICoKICAgICAqIEByZXR1cm4gYXJyYXkKICAgICAqLwoJcHVibGljIGZ1bmN0aW9uIGdldFBhdGgoKSB7CgkJcmV0dXJuICR0aGlzLT5wYXRoOwoJfQp9CgokdHJpYW5nbGUgPSBuZXcgVHJpYW5nbGUoOCk7CiR0cmlhbmdsZS0+YnVpbGQoKS0+ZmluZFBhdGgoKTsKZWNobyAnPGhyPic7Cgpmb3JlYWNoICgkdHJpYW5nbGUtPmdldFBhdGgoKSBhcyAkbm9kZSkgewoJZWNobyAkbm9kZVsndmFsdWUnXSAuICcgKyAnOwp9CgoKZWNobyAnPGhyPic7CmZvcmVhY2ggKCR0cmlhbmdsZS0+Z2V0U3RydWN0dXJlKCkgYXMgJGsgPT4gJGxldmVsKSB7CgkkY3VycmVudF9ub2RlID0gJHRyaWFuZ2xlLT5nZXRQYXRoKClbJGtdOwoJZWNobyAnPGRpdj4nOwoJZm9yZWFjaCgkbGV2ZWwgQVMgJGtleSA9PiAkdmFsdWUpIHsKCQkkY2xhc3MgPSAoJGN1cnJlbnRfbm9kZVsnaW5kZXgnXSA9PSAka2V5KSA/ICdyZWQnIDogJyc7CgkJZWNobyAnPHNwYW4gc3R5bGU9ImNvbG9yOicuJGNsYXNzLiciPicuJHZhbHVlLic8L3NwYW4+JzsKCX0KCWVjaG8gJzwvZGl2Pic7Cn0K