Перебор элементов двумерного массива

Активист

Активист
Команда форума
В чем сложность? Покажи код, который ты пытался делать, и конкретно, что у тебя не получается.

А для сортировки - дели на разряды и иди от меньшего к большему, основываясь на сложении ключей, словно складываешь числа неизвестно-ричной системы счисления для каждого разряда.


PS: Что-то на форуме стало много задач решать. Одному умножения, второму все комбинации подавай.

Решение твоей задачи:

PHP:
<pre>
<?php
error_reporting(E_ALL);
$strings = array("[1|2][1|2|3][1|2]", "[1|2][5|7|8]");
foreach ($strings as $string) {
	
	
	preg_match_all("/\[([0-9\|]+)\]/", $string, $match) or die("Bad string");
	
	$array = array();
	foreach ($match[0] as $key => $item) {
		$array[] = explode("|", $match[1][$key]);
	}
	
	//var_dump($array);
	
	$combinations = 1;
	
	for ($i = 0; $i < sizeof($array); $i++) {
		$combinations *= sizeof($array[$i]);
		$currentKeys[$i] = 0;
	}
	
	$n = sizeof($array)-1;
	
	for ($i = 0; $i < $combinations; $i++) {
		$string = null;
		
		for ($k = 0; $k < sizeof($array); $k++) {
			$string .= $array[$k][$currentKeys[$k]];
		}
		
		echo $string."\n";
		
		$currentKeys[$n]++;
		for ($k = sizeof($array)-1; $k >= 0; $k--) {
			if ($currentKeys[$k] >= sizeof($array[$k])) {
	//			echo "~";
				$currentKeys[$k] = 0;
				if ($k-1 >= 0) {
					$currentKeys[$k-1]++;
				}
			}
		}
	}
}


?>
Результат:
Код:
111
112
121
122
131
132
211
212
221
222
231
232
15
17
18
25
27
28
 

alxander

Новичок
Активист
Спасибо огромное!!! Работает как надо при всех допустимых входных данных.
На выходных сяду, разберусь конкретно со всем кодом, и впредь постараюсь лучше думать своей головой:))

Всем спасибо, задача решена!
 

Активист

Активист
Команда форума
alxander
Пожалуйста
> На выходных сяду, разберусь конкретно со всем кодом
Чтоб тебе лучше разбиралось расскажу о реализации этой задачи из жизни.

Представь себе спидометр (пробегометр), у которого как известно, крутится только первый километр (самый маленький разряд). Этот код, словно спидометр (пробегометр), только у нас не по 10 цифр на каждом барабане, а определенное количество.

Для этой реализации взят массив, в значениях которого лежат данные, а ключи массива есть цифры барабана "пробегометра" - от 0 до Nk.

PHP:
    // Этот код вычисляет количество максимальных комбинаций
    // исходя из размерности, а также инициализирует счетчик, 
    // в котором хранится информация о текущем значении 
    // каждого барабана.
    $combinations = 1;
    
    for ($i = 0; $i < sizeof($array); $i++) {
        $combinations *= sizeof($array[$i]);
        $currentKeys[$i] = 0;
    }
    // ...

   // Вычисляет последний разряд (последний барабан, который  
   // будет крутиться) при прохождении 1-го километра трассы
   $n = sizeof($array)-1; 
   
    // ...
   
    // Цикл, делаем его столько, сколько есть возможных 
    // комбинаций
    for ($i = 0; $i < $combinations; $i++) { 

    // ...    

    // Собираем показания счетчика пробега
    for ($k = 0; $k < sizeof($array); $k++) { 

    // ...

    // Наш водитель проехал еще один километр
    $currentKeys[$n]++; 
 
   // ...
   // ...
   // следующий блок цикла играет своего рода роль "палочек на  
   // барабане", которые инкриминируют следующий левее  
   // барабан и обнуляют значения текущего барабана.

    for ($k = sizeof($array)-1; $k >= 0; $k--) {
 

zerkms

TDD infected
Команда форума
предлагаю решение ещё проще:
создаём N (по числу массивов) временных таблиц в mysql, закидываем туда данные и одним примитивным запросом получаем их декартово перемножение.

я молодец? :)
 

zamanko

Новичок
Помогите переписать этот код для не числовых индексов массива

приходит такой массив:
PHP:
array(8) { 
["product_type"]=> array(1) { [1]=> string(1) "1" } 
["price"]=> array(0) { } 
["sex"]=> array(2) { ["m"]=> string(1) "m" ["w"]=> string(1) "w" } 
["collection"]=> array(2) { [34]=> string(2) "34" [33]=> string(2) "33" }
["assortment"]=> array(9) { [13]=> string(2) "13" [21]=> string(2) "21" [16]=> string(2) "16" [29]=> string(2) "29" [47]=> string(2) "47" [15]=> string(2) "15" [36]=> string(2) "36" [14]=> string(2) "14" [18]=> string(2) "18" } 
["brand"]=> array(3) { [37]=> string(2) "37" [36]=> string(2) "36" [12]=> string(2) "12" } 
["color"]=> array(1) { [100]=> string(3) "100" } 
["size"]=> array(1) { [115]=> string(3) "115" } 
}
и для него нужно построить все комбинации
 

radioheaded

PHP нуб
Сверху