configure($prefix_length, $try_suffix); $this->min_length = $min_length; $this->max_length = $max_length; } private function generatePieces($s) { $res = array(); for($len = 1; $len <= $this->prefix_length; $len++) { $res[] = substr($s, 0, $len); } if($this->try_suffix) { $res[] = $s[0] . $s[strlen($s) - 1]; } return $res; } private function generateRecursive($res, $name_parts, $index) { if($index < count($name_parts)) { foreach($this->generatePieces($name_parts[$index]) as $piece) { $this->generateRecursive($res . $piece, $name_parts, $index + 1); } } else { if($this->min_length <= strlen($res) && strlen($res) <= $this->max_length) { $this->process($res); } } } public function generate($name) { $name_parts = explode(' ', strtolower($this->translate($name))); $this->generateRecursive('', $name_parts, 0); } protected function configure($prefix_length, $try_suffix) { $this->prefix_length = $prefix_length; $this->try_suffix = $try_suffix; } protected abstract function translate($name); protected abstract function process($alias); } class AliasGeneratorDK2ENEchoLine extends AliasGenerator { use DK2EN; use EchoLine; } class SmartAliasGeneratorDK2ENEchoLine extends AliasGeneratorDK2ENEchoLine { private $length; public function __construct($length) { parent::__construct(0, false, $length, $length); $this->length = $length; } public function generate($name) { $num_parts = count(explode(' ', $name)); $prefix_length = (int)ceil($this->length / $num_parts) + 1; if($prefix_length > 2) { $try_suffix= true; $prefix_length--; } else { $try_suffix= false; } $this->configure($prefix_length, $try_suffix); parent::generate($name); } } $gen = new AliasGeneratorDK2ENEchoLine(2, true, 5, 5); $gen->generate('Søren Hyggesen Nielsen'); function test($gen, $name) { echo "$name:\r\n"; $gen->generate($name); } $smartgen = new SmartAliasGeneratorDK2ENEchoLine(5); test($smartgen, 'Søren Hyggesen Nielsen'); test($smartgen, 'Søren Hyggesen Andersen Nielsen'); test($smartgen, 'Søren Ib Hyggesen Andersen Nielsen'); test($smartgen, 'Gurli Andersen'); ?>