Структориране на масиви

dakata__92

Super Moderator
Колеги имам един доста объркан за обясняване проблем с масиви. Та имам три масива: $y_busy, $x_busy и $matrix[$y][$x].
Структората на $y_busy e:
PHP:
Array
(
    [0] => 1
    [1] => 2
    [2] => 3
    [3] => 4
    [4] => 5
    [5] => 6
    [6] => 7
    [7] => 8
    [8] => 9
    [9] => 15
    [10] => 16
    [11] => 17
    [12] => 18
    [13] => 19
    [14] => 20
    [15] => 21
    [16] => 22
    [17] => 23
    [18] => 30
    [19] => 31
    [20] => 32
    [21] => 33
    [22] => 34
    [23] => 35
    [24] => 36
    [25] => 37
    [26] => 38
)
Структората на $x_busy e:
PHP:
Array
(
    [0] => 2
    [1] => 3
    [2] => 4
    [3] => 5
    [4] => 6
    [5] => 7
    [6] => 12
    [7] => 13
    [8] => 14
    [9] => 15
    [10] => 16
    [11] => 17
    [12] => 22
    [13] => 23
    [14] => 24
    [15] => 25
    [16] => 26
    [17] => 27
    [18] => 32
    [19] => 33
    [20] => 34
    [21] => 35
    [22] => 36
    [23] => 37
)
Така. Сега искам с тези масиви да извадя части от двумерният масив $matrix[][]; Проблемът идва че трябва да ползвам value стойностите на двата масива за да изведа определени редове и колони от матрицата.
Пробвах така:
PHP:
echo "<pre >";
if(isSet($y_free) && isSet($x_free))
{
	for ($y=0; $y < $imgHeight; $y++)
	{
		if(in_array($y, $y_busy))
		{
			echo "<br>";
			for ($x=0; $x < $imgWidth; $x++)
			{
				if(in_array($x, $x_busy))
				{
					echo $matrix[$y][$x];
				}
			}
		}
	}
}
echo "</pre><br>";
Получава се нещо подобно на това което искам, но не съвсем. Трябва да изведа от $matrix[$y][$x] по скалата y 1,2,3,4,5,6,7,8,9 и по скалата x 2,3,4,5,6,7 идващи от $y_busy и $x_busy, след което да премина на нов
ред и да взема следващите последователни стойности от двата масива за да бъдат изведени на нов ред по скалата y 15,16,17,18,19,20,21,22,23 и по скалата x 12,13,14,15,16,17. Фактически масив $y_busy има 3 последователни реда с цифри:
PHP:
Array
(
    [0] => 1
    [1] => 2
    [2] => 3
    [3] => 4
    [4] => 5
    [5] => 6
    [6] => 7
    [7] => 8
    [8] => 9 // Ред 1
    [9] => 15
    [10] => 16
    [11] => 17
    [12] => 18
    [13] => 19
    [14] => 20
    [15] => 21
    [16] => 22
    [17] => 23  // Ред 2
    [18] => 30
    [19] => 31
    [20] => 32
    [21] => 33
    [22] => 34
    [23] => 35
    [24] => 36
    [25] => 37
    [26] => 38 // Ред 3
)
докато, $x_busy има 4
PHP:
Array
(
    [0] => 2
    [1] => 3
    [2] => 4
    [3] => 5
    [4] => 6
    [5] => 7 // Ред 1
    [6] => 12
    [7] => 13
    [8] => 14
    [9] => 15
    [10] => 16
    [11] => 17 // Ред 2
    [12] => 22
    [13] => 23
    [14] => 24
    [15] => 25
    [16] => 26
    [17] => 27 //Ред 3
    [18] => 32
    [19] => 33
    [20] => 34
    [21] => 35
    [22] => 36
    [23] => 37 //Ред 4
)

Което прави 3х4 = 12 извеждания.
В момента с кода, който дадох изходната матрица се получава така:

Код:
A(1 2)A(1 3)A(1 4)A(1 5)A(1 6)A(1 7)A(1 12)A(1 13)A(1 14)A(1 15)A(1 16)A(1 17)A(1 22)A(1 23)A(1 24)A(1 25)A(1 26)A(1 27)A(1 32)A(1 33)A(1 34)A(1 35)A(1 36)A(1 37)
A(2 2)A(2 3)A(2 4)A(2 5)A(2 6)A(2 7)A(2 12)A(2 13)A(2 14)A(2 15)A(2 16)A(2 17)A(2 22)A(2 23)A(2 24)A(2 25)A(2 26)A(2 27)A(2 32)A(2 33)A(2 34)A(2 35)A(2 36)A(2 37)
A(3 2)A(3 3)A(3 4)A(3 5)A(3 6)A(3 7)A(3 12)A(3 13)A(3 14)A(3 15)A(3 16)A(3 17)A(3 22)A(3 23)A(3 24)A(3 25)A(3 26)A(3 27)A(3 32)A(3 33)A(3 34)A(3 35)A(3 36)A(3 37)
A(4 2)A(4 3)A(4 4)A(4 5)A(4 6)A(4 7)A(4 12)A(4 13)A(4 14)A(4 15)A(4 16)A(4 17)A(4 22)A(4 23)A(4 24)A(4 25)A(4 26)A(4 27)A(4 32)A(4 33)A(4 34)A(4 35)A(4 36)A(4 37)
A(5 2)A(5 3)A(5 4)A(5 5)A(5 6)A(5 7)A(5 12)A(5 13)A(5 14)A(5 15)A(5 16)A(5 17)A(5 22)A(5 23)A(5 24)A(5 25)A(5 26)A(5 27)A(5 32)A(5 33)A(5 34)A(5 35)A(5 36)A(5 37)
A(6 2)A(6 3)A(6 4)A(6 5)A(6 6)A(6 7)A(6 12)A(6 13)A(6 14)A(6 15)A(6 16)A(6 17)A(6 22)A(6 23)A(6 24)A(6 25)A(6 26)A(6 27)A(6 32)A(6 33)A(6 34)A(6 35)A(6 36)A(6 37)
A(7 2)A(7 3)A(7 4)A(7 5)A(7 6)A(7 7)A(7 12)A(7 13)A(7 14)A(7 15)A(7 16)A(7 17)A(7 22)A(7 23)A(7 24)A(7 25)A(7 26)A(7 27)A(7 32)A(7 33)A(7 34)A(7 35)A(7 36)A(7 37)
A(8 2)A(8 3)A(8 4)A(8 5)A(8 6)A(8 7)A(8 12)A(8 13)A(8 14)A(8 15)A(8 16)A(8 17)A(8 22)A(8 23)A(8 24)A(8 25)A(8 26)A(8 27)A(8 32)A(8 33)A(8 34)A(8 35)A(8 36)A(8 37)
A(9 2)A(9 3)A(9 4)A(9 5)A(9 6)A(9 7)A(9 12)A(9 13)A(9 14)A(9 15)A(9 16)A(9 17)A(9 22)A(9 23)A(9 24)A(9 25)A(9 26)A(9 27)A(9 32)A(9 33)A(9 34)A(9 35)A(9 36)A(9 37)
A(15 2)A(15 3)A(15 4)A(15 5)A(15 6)A(15 7)A(15 12)A(15 13)A(15 14)A(15 15)A(15 16)A(15 17)A(15 22)A(15 23)A(15 24)A(15 25)A(15 26)A(15 27)A(15 32)A(15 33)A(15 34)A(15 35)A(15 36)A(15 37)
A(16 2)A(16 3)A(16 4)A(16 5)A(16 6)A(16 7)A(16 12)A(16 13)A(16 14)A(16 15)A(16 16)A(16 17)A(16 22)A(16 23)A(16 24)A(16 25)A(16 26)A(16 27)A(16 32)A(16 33)A(16 34)A(16 35)A(16 36)A(16 37)
A(17 2)A(17 3)A(17 4)A(17 5)A(17 6)A(17 7)A(17 12)A(17 13)A(17 14)A(17 15)A(17 16)A(17 17)A(17 22)A(17 23)A(17 24)A(17 25)A(17 26)A(17 27)A(17 32)A(17 33)A(17 34)A(17 35)A(17 36)A(17 37)
A(18 2)A(18 3)A(18 4)A(18 5)A(18 6)A(18 7)A(18 12)A(18 13)A(18 14)A(18 15)A(18 16)A(18 17)A(18 22)A(18 23)A(18 24)A(18 25)A(18 26)A(18 27)A(18 32)A(18 33)A(18 34)A(18 35)A(18 36)A(18 37)
A(19 2)A(19 3)A(19 4)A(19 5)A(19 6)A(19 7)A(19 12)A(19 13)A(19 14)A(19 15)A(19 16)A(19 17)A(19 22)A(19 23)A(19 24)A(19 25)A(19 26)A(19 27)A(19 32)A(19 33)A(19 34)A(19 35)A(19 36)A(19 37)
A(20 2)A(20 3)A(20 4)A(20 5)A(20 6)A(20 7)A(20 12)A(20 13)A(20 14)A(20 15)A(20 16)A(20 17)A(20 22)A(20 23)A(20 24)A(20 25)A(20 26)A(20 27)A(20 32)A(20 33)A(20 34)A(20 35)A(20 36)A(20 37)
A(21 2)A(21 3)A(21 4)A(21 5)A(21 6)A(21 7)A(21 12)A(21 13)A(21 14)A(21 15)A(21 16)A(21 17)A(21 22)A(21 23)A(21 24)A(21 25)A(21 26)A(21 27)A(21 32)A(21 33)A(21 34)A(21 35)A(21 36)A(21 37)
A(22 2)A(22 3)A(22 4)A(22 5)A(22 6)A(22 7)A(22 12)A(22 13)A(22 14)A(22 15)A(22 16)A(22 17)A(22 22)A(22 23)A(22 24)A(22 25)A(22 26)A(22 27)A(22 32)A(22 33)A(22 34)A(22 35)A(22 36)A(22 37)
A(23 2)A(23 3)A(23 4)A(23 5)A(23 6)A(23 7)A(23 12)A(23 13)A(23 14)A(23 15)A(23 16)A(23 17)A(23 22)A(23 23)A(23 24)A(23 25)A(23 26)A(23 27)A(23 32)A(23 33)A(23 34)A(23 35)A(23 36)A(23 37)
A(30 2)A(30 3)A(30 4)A(30 5)A(30 6)A(30 7)A(30 12)A(30 13)A(30 14)A(30 15)A(30 16)A(30 17)A(30 22)A(30 23)A(30 24)A(30 25)A(30 26)A(30 27)A(30 32)A(30 33)A(30 34)A(30 35)A(30 36)A(30 37)
A(31 2)A(31 3)A(31 4)A(31 5)A(31 6)A(31 7)A(31 12)A(31 13)A(31 14)A(31 15)A(31 16)A(31 17)A(31 22)A(31 23)A(31 24)A(31 25)A(31 26)A(31 27)A(31 32)A(31 33)A(31 34)A(31 35)A(31 36)A(31 37)
A(32 2)A(32 3)A(32 4)A(32 5)A(32 6)A(32 7)A(32 12)A(32 13)A(32 14)A(32 15)A(32 16)A(32 17)A(32 22)A(32 23)A(32 24)A(32 25)A(32 26)A(32 27)A(32 32)A(32 33)A(32 34)A(32 35)A(32 36)A(32 37)
A(33 2)A(33 3)A(33 4)A(33 5)A(33 6)A(33 7)A(33 12)A(33 13)A(33 14)A(33 15)A(33 16)A(33 17)A(33 22)A(33 23)A(33 24)A(33 25)A(33 26)A(33 27)A(33 32)A(33 33)A(33 34)A(33 35)A(33 36)A(33 37)
A(34 2)A(34 3)A(34 4)A(34 5)A(34 6)A(34 7)A(34 12)A(34 13)A(34 14)A(34 15)A(34 16)A(34 17)A(34 22)A(34 23)A(34 24)A(34 25)A(34 26)A(34 27)A(34 32)A(34 33)A(34 34)A(34 35)A(34 36)A(34 37)
A(35 2)A(35 3)A(35 4)A(35 5)A(35 6)A(35 7)A(35 12)A(35 13)A(35 14)A(35 15)A(35 16)A(35 17)A(35 22)A(35 23)A(35 24)A(35 25)A(35 26)A(35 27)A(35 32)A(35 33)A(35 34)A(35 35)A(35 36)A(35 37)
A(36 2)A(36 3)A(36 4)A(36 5)A(36 6)A(36 7)A(36 12)A(36 13)A(36 14)A(36 15)A(36 16)A(36 17)A(36 22)A(36 23)A(36 24)A(36 25)A(36 26)A(36 27)A(36 32)A(36 33)A(36 34)A(36 35)A(36 36)A(36 37)
A(37 2)A(37 3)A(37 4)A(37 5)A(37 6)A(37 7)A(37 12)A(37 13)A(37 14)A(37 15)A(37 16)A(37 17)A(37 22)A(37 23)A(37 24)A(37 25)A(37 26)A(37 27)A(37 32)A(37 33)A(37 34)A(37 35)A(37 36)A(37 37)
A(38 2)A(38 3)A(38 4)A(38 5)A(38 6)A(38 7)A(38 12)A(38 13)A(38 14)A(38 15)A(38 16)A(38 17)A(38 22)A(38 23)A(38 24)A(38 25)A(38 26)A(38 27)A(38 32)A(38 33)A(38 34)A(38 35)A(38 36)A(38 37)
Целта е да се получат 12 матрици като тази:
Код:
A(1 2)A(1 3)A(1 4)A(1 5)A(1 6)A(1 7)
A(2 2)A(2 3)A(2 4)A(2 5)A(2 6)A(2 7)
A(3 2)A(3 3)A(3 4)A(3 5)A(3 6)A(3 7)
A(4 2)A(4 3)A(4 4)A(4 5)A(4 6)A(4 7)
A(5 2)A(5 3)A(5 4)A(5 5)A(5 6)A(5 7)
A(6 2)A(6 3)A(6 4)A(6 5)A(6 6)A(6 7)
A(7 2)A(7 3)A(7 4)A(7 5)A(7 6)A(7 7)
A(8 2)A(8 3)A(8 4)A(8 5)A(8 6)A(8 7)
A(9 2)A(9 3)A(9 4)A(9 5)A(9 6)A(9 7)
//<br>
//Следващата трябва да е 
A(1 12)A(1 13)A(1 14)A(1 15)A(1 16)A(1 17)
A(2 12)A(2 13)A(2 14)A(2 15)A(2 16)A(2 17)
A(3 12)A(3 13)A(3 14)A(3 15)A(3 16)A(3 17)
A(4 12)A(4 13)A(4 14)A(4 15)A(4 16)A(4 17)
A(5 12)A(5 13)A(5 14)A(5 15)A(5 16)A(5 17)
A(6 12)A(6 13)A(6 14)A(6 15)A(6 16)A(6 17)
A(7 12)A(7 13)A(7 14)A(7 15)A(7 16)A(7 17)
A(8 12)A(8 13)A(8 14)A(8 15)A(8 16)A(8 17)
A(9 12)A(9 13)A(9 14)A(9 15)A(9 16)A(9 17)

...
Как е възможно да извадя тези части от масива $matrix? Матрицата A e със полета A($y_busy $x_busy). Надявам се да съм обяснил правилно какъв е проблема.
 
Мисля, че грешката е тук:

Код:
echo $matrix[$y][$x];

Направи го така:

Код:
echo $matrix[$y_busy[$y]][$x_busy[$x]];

Може да съм объркалx и у, за всеки случай пробвай и наобратно.
 
anonimen каза:
Мисля, че грешката е тук:

Код:
echo $matrix[$y][$x];

Направи го така:

Код:
echo $matrix[$y_busy[$y]][$x_busy[$x]];

Може да съм объркалx и у, за всеки случай пробвай и наобратно.
Не, не! Във вложен цикъл е не е това грешката. Моят код си работи просто искам по някакъв начин да отделям части от масива $matrix с примерно начало $matrix[1][2]; и край $matrix[9][7]; без да ми се налага да пиша 12 вложени цикъла. Това изчертава правоъгълник изглеждащ така по кординати:
Код:
1-2  1-3  1-4  1-5  1-6  1-7
2-2  2-3  2-4  2-5  2-6  2-7
.
.
.
9-2  9-3  9-4  9-5  9-6  9-7
//минава на нов ред и изчертава следващите кординати
1-12  1-13  1-14  1-15  1-16  1-17
2-12  2-13  2-14  2-15  2-16  2-17
.
.
.
9-12  9-13  9-14  9-15  9-16  9-17
 
Доста ми е сложно питането затова щеее се пробвам на части да задавам въпроса и да правя малки стъпки към решението му. Та как да обходя този масив и да установя, че има три последователни колони?
1,2,3,4,5,6,7,8,9 (1); 15,16,17,18,19,20,21,22,23 (2); 30,31,32,33,34,35,36,37,38 (3). Мога ли да взема на всяка колона максималната и минималната стойност? На (1) e 1-9; на (2) e 15-23 и на (3) e 30-38. Досетих се, че може да се ползват min() и max() но ще трябва да деля на части масива...
PHP:
Array
(
    [0] => 1
    [1] => 2
    [2] => 3
    [3] => 4
    [4] => 5
    [5] => 6
    [6] => 7
    [7] => 8
    [8] => 9
    [9] => 15
    [10] => 16
    [11] => 17
    [12] => 18
    [13] => 19
    [14] => 20
    [15] => 21
    [16] => 22
    [17] => 23
    [18] => 30
    [19] => 31
    [20] => 32
    [21] => 33
    [22] => 34
    [23] => 35
    [24] => 36
    [25] => 37
    [26] => 38
)
 
Мисля, че ще е най-лесно ако дадеш някъв примерен код, върху който да тестваме - с въведени двата масива и това дето ти си се опитал да направиш.

Че така е малко трудно с налучкване :roll:
 
Код:
var arr = [1,2,3,4,5,6,7,8,9,15,16,17,18,19,20,21,22,23,30,31,32,33,34,35,36,37,38];
var groups = [];
groups[0] = [];
groups[0][0] = arr[0];
var j = 0, k = 1, i;

for(i = 1; i < arr.length; i++, k++) 
    if(arr[i] == arr[i-1] + 1) groups[j][k] = groups[j][k-1] + 1;
    else { j++; k = 0; groups[j] = []; groups[j][k] = arr[i]; }

for(i = 0; i < groups.length; i++)
    console.log(Math.min.apply(null, groups[i]) + " " + Math.max.apply(null, groups[i]));
Вярвам че ще се справиш да си го напишеш, просто аз си прототайпвам на JavaScript, а и честно не ми се занимава с php. Ако нещо не разбираш кажи ще обясняваме :?:
Нарочно съм го направил така, видях че споменаваш за вадене на части та ето го цялото с ваденето и Min & Max :)

Едит: Абе забелязах че искаш да правиш пълно комбиниране между всичките "колони" който имаш? Обаче ще ми е много по лесно да ти помогна на там, ако просто кажеш за какво ти е това - може да има по лесен начин :)
 
Отделям части от матрица за разпознаване по алгоритъм който написах. Принципно ако разгърна двата масива с вложен цикъл foreach така:

PHP:
echo "<pre class='imgcode'>";
foreach($y_busy as $v)
{
	echo"<br>";
	foreach($x_busy as $k)
	{
		echo $HexColor[$v][$k];
	}
}
echo "</pre><br>";
Получавам отделянето на празните редове, но не отделя образа на части просто го сбива и филтрира празните редове и колони. Това се получава:
7562870z.png


Оригинала е това:
7562869N.png


Искам да отделям всеки символ на отделен ред без да се налага да пиша 12 вложени цикъла и да отделям нещата.
 
Справих се със задачата, бгодарение на измайсторена функция за обработка на информацията и два вложени foreach с два for в тях.
PHP:
foreach
{
  foreach()
  {
      for()
     {
         for()
         {
              .....
         }
     }
  }
}
 

Back
Горе