Во всяком случае, чтобы упростить это гнездо крыс петлей foreach?

Это работает, но уродливее, чем ад, в основном он выполняет итерацию через две отдельные части вспомогательного массива, видя, есть ли наибольший общий знаменатель, кроме 1 в значениях обоих подматриц, а если есть, умножая базовое значение на 1,5

Извините за неряшливый код раньше времени.

error_reporting(E_ALL); ini_set('display_errors', '1'); class CSVParser { public $output = NULL; public $digits = NULL; public function __construct($file) { if (!file_exists($file)) { throw new Exception("$file does not exist"); } $this->contents = file_get_contents($file); $this->output = array(); $this->digits = array(); $this->factor = array(); } public function parse($separatorChar1 = ',', $separatorChar2 = ';', $enclosureChar = '"', $newlineChar = "\n") { $lines = explode($newlineChar, $this->contents); foreach ($lines as $line) { if (strlen($line) == 0) continue; $group = array(); list($part1, $part2) = explode($separatorChar2, $line); $group[] = array_map(array($this, "trim_value"), explode($separatorChar1, $part1), array("$enclosureChar \t")); $group[] = array_map(array($this, "trim_value"), explode($separatorChar1, $part2), array("$enclosureChar \t")); $this->output[] = $group; } } private function trim_value($value, $chars) { return preg_replace("#^( |" . $chars . ")+#", '', $value); } private function gcd($x,$y) { do { $rest=$x%$y; $x=$y; $y=$rest; } while($rest!==0); return $x; } public function algorithm() { $alpha = array( 'c' => str_split('bcdfghjklmnpqrstvwxz'), 'v' => str_split('aeiouy') ); $i=$k=0; foreach ($this->output as $item) { $cnt = 0; $this->digits[$i] = array(); foreach ($item as $part) { $this->digits[$i][$cnt] = array(); $new = array(); foreach ($part as $str) { $v = count(array_intersect(str_split($str), $alpha['v'])); $c = count(array_intersect(str_split($str), $alpha['c'])); $t = strlen(str_replace(' ', '', $str)); $new = ($cnt == 0) ? array('v' => $v, 'c' => $c, 't' => $t, 'm' => ($t%2) ? $v * 1.5 : $c) : array('v' => $v, 'c' => $c, 't' => $t); $this->digits[$i][$cnt][] = $new; } $cnt++; } $i++; } $h=$cuml=0; foreach($this->digits as &$slice) { foreach($slice[0] as &$sliceName){ foreach($slice[1] as $sliceProduct) { foreach($sliceProduct as $pKey=>$pVal) { foreach($sliceName as $nKey=>$nVal) { $tmp[$h] = ($this->gcd($pVal,$nVal) != 1) ? ++$cuml:''; } } $tmp[$h] = $sliceName['m']*$cuml*1.5; $h++; $cuml=0; }$h=0; $sliceName['f'] = $tmp; $tmp=''; } } foreach($this->digits as &$u){unset($u[1]);} } } $parser = new CSVParser("file.csv"); $parser->parse(); //print_r($parser->output); $parser->algorithm(); print_r($parser->digits); 

Пример CSV для запроса

 Jeff Goes, Mika Enrar;Triple Threat, Dogs on Bikes Sonny Ray, Lars McGarvitch, Jason McKinley;Kasabian, Lords of Acid, Hard-Fi 

Выход

 Array ( [0] => Array ( [0] => Array ( [0] => Array ( [v] => 3 [c] => 3 [t] => 8 [m] => 3 [f] => Array ( [0] => 40.5 [1] => 4.5 // Remainder.. So 'Jeff Goes' => 'Dogs on Bikes' ) ) [1] => Array ( [v] => 3 [c] => 4 [t] => 9 [m] => 4.5 [f] => Array ( [0] => 67.5 // High Score! So 'Mika Enrar' => 'Triple Threat' [1] => 13.5 ) ) ) ) [1] => Array ( [0] => Array ( [0] => Array ( [v] => 4 [c] => 2 [t] => 8 [m] => 2 [f] => Array ( [0] => 24 [1] => 12 [2] => 24 // Next Highest 'Sonny Ray' => 'Hard-Fi' ) ) [1] => Array ( [v] => 3 [c] => 8 [t] => 14 [m] => 8 [f] => Array ( [0] => 84 // High Score! (This is really a tie, but 'm' has the highest secondary value so...) [1] => 60 // 'Lars McGarvitch => 'Kasabian' [2] => 84 ) ) [2] => Array ( [v] => 5 [c] => 5 [t] => 13 [m] => 7.5 [f] => Array ( [0] => 0 [1] => 0 // The only one left 'Jason McKinley' => 'Lords of Acid' [2] => 11.25 ) ) ) ) ) 

Что оно делает

То, что этот класс делает до сих пор, разбивает один массив csv, разделяет контент до; и после этого в два поддиапазона. Подсчитайте согласные и гласные обоих, найдите, существует ли наибольший общий знаменатель между двумя подразделами для каждой пары CV или смешанных букв и создайте значение для назначения группы для продукта.

Что действительно нужно делать, хотя

Наибольшее генерируемое значение должно быть связано с полосой, которая создала это высокое значение. Так что я пытаюсь на самом деле сделать, это связать имя с группой в зависимости от того, насколько высока оценка, которую он в конечном итоге создает. Я примерно на полпути через = (

Как вы, ребята, видите, этот код беспорядок, буквально. Все, что мне действительно нужно, – это присвоить имя группе на основе чисел, которые я генерирую.

Я должен согласиться со всеми здесь … но я бы хотел добавить:

Вместо того, чтобы искать, как проще всего $this->digits , вам следует серьезно подумать о переосмыслении структуры данных в $this->digits .

Кроме того, объединение всех в один массив не всегда имеет смысл. Но когда это происходит, структура может быть продумана так, чтобы она была интуитивно понятной и легко проходила.

Без дополнительной информации о том, что это делает, мы не можем предложить, как реструктурировать ваши данные / класс. Старт будет давать нам то, что выглядит массив $this->digits . Кроме того, будет достаточно информации о вашей проблеме (например, как этот метод используется).

Если он работает, почему вы его меняете? Представление? Рефакторинг? Бизнес изменился? Изменены требования? Чистый код Samaritan? Правило бойскаута?

Когда я сталкиваюсь с «кодом спагетти», я оставляю его в покое, если я не должен его полностью изменить. Тем не менее, я бы написал пару модульных тестов, проверяющих вывод «кода спагетти», чтобы я знал, что я ничего не сломал и не сделал что-то хуже.