Алгоритм составления массива

Vin-Diesel

Новичок
Имеем два массива исходных данных:
PHP:
$main = array(1, 2);
$other = array(3, 4, 5);
$min = 2;
$max = 2;

# Алгоритм
В итоге нужен массив (то что в скобочках для примера логики и в результирующий массив не будет включено):
1,3; 1,4; 1,5; 1,2;
3,1; 4,1; 5,1; 2,1;
2,3; 2,4; 2,5(; 2,1);
3,2; 4,2; 5,2(; 1,2);
Размер исходных массивов произвольный, значения минимума, максимума так же произвольны.
То есть для значений мин - 2, макс - 3 будем иметь в результирующем массиве все элементы из примера + кортежи длинной 3.
Как к этому вообще подходить? Посоветуйте))
 

Vin-Diesel

Новичок
Алгоритм насколько я понимаю)
Рекурсивной функцией реализовать, с массивами я что-то путаюсь.. Похоже гоню под вечер(
 

Gremboloid

инженера Гр...
плз оформи результирующий массив, а то не понятно, что и итоге получить хочешь.
 

Vin-Diesel

Новичок
PHP:
$result = array(
			array(1,3),
			array(1,4),
			array(1,5),
			array(1,2),
			array(3,1),
			array(4,1),
			array(5,1),
			array(2,1),
			array(2,3),
			array(2,4),
			array(2,5),
			array(3,2),
			array(4,2),
			array(5,2)
			);
Ай все моя голова... Утром еще подумаю... С кортежами длинной 2 еще получается, а выше.. бред)
 

Vin-Diesel

Новичок
Получилось, вроде то... ну... для меня сейчас главное работает)))
Задумка была генерировать поисковые фразы по заданным ключевым словам.
Функция принимаем на вход два массива - один с основными ключевиками (будут во всех подмассивах) и дополнительными.
Так же два числа, минимальная и максимальная длины подмассивов. Побалуйтесь вообщем, только не сильно - в данном примере выводит 2382 фразы)
Может кому будет полезно:
PHP:
function multiple($marray, $array, $minLen, $maxLen) {
	$results = array();
	
	if($minLen == 0) {
		$results[] = array();
		$minLen++;
	}
	
	if($minLen == 1) {
		foreach($marray as $mword)
			$results[] = array($mword);
		$minLen++;
	}
	
	$msize = sizeof($marray);
	for($m = $minLen; $m <= $maxLen; $m++) {
		reset($marray);
		for($i = 0; $i < $msize; $i++) {
			$curEl = current($marray);
			$curEl = is_array($curEl) ? $curEl : array($curEl);
			$curKey = key($marray);
			$tmpArr = array_merge($marray, $array);
			unset($tmpArr[$curKey]);
			next($marray);
			$tmp = _multiple($curEl, $tmpArr);
			while(isset($tmp[0]) && sizeof($tmp[0]) != $m)
				$tmp = _multiple($tmp, $tmpArr);
			$results = array_merge($results, $tmp);
		}
	}
	
	$nresults = array();
	
	foreach($results as $result) {
		if(sizeof($result) <= 1)
			continue;
		$main = $result[0];
		for($i = 1; $i < sizeof($result); $i++) {
			$tmpArr = $result;
			$tmpArr[0] = $tmpArr[$i];
			$tmpArr[$i] = $main;
			$nresults[] = $tmpArr;
		}
	}
	
	$results = array_merge($results, $nresults);
	
	return $results;
}
function _multiple($array, $words) {
	$results = array();
	if(isset($array[0]) && is_array($array[0])) {
		foreach($array as $mword)
			$results = array_merge($results, _multiple($mword, $words));
		return $results;
	}
	foreach($words as $word) {
		if(array_search($word, $array) !== false)
			continue;
		$word = is_array($word) ? $word : array($word);
		$results[] = array_merge($array, $word);
	}
	return $results;
}

$results = multiple(array('купить'),
					array('ноги', 'руки', 'нос', 'голову', 'уши', 'шею'), 2, 5);
foreach($results as $key => $result) {
	$string = '';
	foreach($result as $word)
		$string .= $word . ' ';
	$results[$key] = '"' . rtrim($string) . '"';
}
$results = array_unique($results);
foreach($results as $result)
	echo $result . '<br />';
Если у кого есть по-проще варианты пишите))))
 
Сверху