[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Вывести опр. элементы массива.
Joker
Есть двухмерные массивы:
7х3 (7 строк и 3 ячейки):
из него нужно вывести элементы со следующими ключами:
(строка)x(ячейка)
1-1
3-1
5-1
7-1
2-3
6-3

и еще один двухмерные массив:
15х5 (15 строк и 5 ячейки)
из него нужно вывести элементы:
(строка)x(ячейка)
01-1
03-1
05-1
07-1
09-1
11-1
13-1
15-1
02-3
06-3
10-3
14-3
04-5
12-5


Оба массив строятся по одному правилу фактически это ёлочка повернутая направо.

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

Вопросы не свзяанные с решением проблеммы но как относящиеся к ней буду записывать сюда даы топик не засорять.
Свернутый текст
Цитата (Игорь_Vasinsky @ 15.01.2011 - 18:09)
а что это такое, если не секрет?

не секрет турнирная сетка)

Цитата (Игорь_Vasinsky @ 15.01.2011 - 17:04)
я блин и так не могу понять - по каким критериям нужно выводить данные???

конкретизируй


вот по каким критериям мне нужно понять, сейчас есть 4 примера как выводится, из этих 4 нужно выяснить это.

Цитата (Игорь_Vasinsky @ 15.01.2011 - 18:19)
А почему такая структура массивов то?
Упорядочить же можно.


ну вот такие массивы приходят)




Спустя 39 минут (15.01.2011 - 14:39) Joker написал(а):
В приложении есть изображение двух мерного массива, красные элементы нужн вывести бирюзовые не нужно.

   for ($i=1;$i<=15;$i++)
{
for ($j=1;$l<=5;$j++)
{
if (/* вот тут нужно придумать алгоритм*/)
{
// выводит
/**
* Выводить нужно только тогда когда
* $i == 01 and $j == 1
* $i == 03 and $j == 1
* $i == 05 and $j == 1
* $i == 07 and $j == 1
* $i == 09 and $j == 1
* $i == 11 and $j == 1
* $i == 13 and $j == 1
* $i == 15 and $j == 1
* $i == 02 and $j == 3
* $i == 06 and $j == 3
* $i == 10 and $j == 3
* $i == 14 and $j == 3
* $i == 04 and $j == 5
* $i == 12 and $j == 5
*/

echo $array[$i][$j];
}
else
{
// не выводим
}
}
}


а вот задача с использованием php )

Спустя 16 минут, 14 секунд (15.01.2011 - 14:55) Игорь_Vasinsky написал(а):
подожди.... если тебе известны ключи элементов массива - то в чё проблема????

например:

echo $array[1][1];
echo $array[1][3];
echo $array[1][5];
echo $array[1][6];
echo $array[2][3];



или автоматизация процесса нужна???

но у тя там нет постянства, т.е. - в первом уровне я вижу что у всех элементов - не чётные ключи, в вот второй и третий уровень - хаотически

Спустя 6 минут, 5 секунд (15.01.2011 - 15:01) Joker написал(а):
Цитата (Игорь_Vasinsky @ 15.01.2011 - 16:55)
подожди.... если тебе известны ключи элементов массива - то в чё проблема????

не известно заранее размерность массива....


массивы будут примерно такие:
3х1
7х3
15х5
31х7
63х9
ну и так далее...

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

Спустя 22 минуты, 20 секунд (15.01.2011 - 15:23) Joker написал(а):
Вот 4 примера массивов от самого маленького до самого большого что у меня хватило сил нарисовать руками.
По рисунку сразу видно как изменяется размерность массива, и какие элементы в каждом массиве нужно вывести, визуально тут есть логика но как эту логику задать через цифры....

Спустя 51 минута, 35 секунд (15.01.2011 - 16:15) Joker написал(а):
Для каждого $i не кратного 2, $j будет равняться $i*2

Берем элемент с ключами $i = 1 и $j = 1: $i не кратное 2, $j == $i*2 : вроде все работает.
Берем элемент с ключами $i = 3 и $j = 1: $i не кратное 2, $j != $i*2: не подходит, а подходить должно...

или я неправильно что то понел?

Спустя 2 минуты, 41 секунда (15.01.2011 - 16:18) Joker написал(а):
Вопросы не свзяанные с решением проблеммы но как относящиеся к ней буду записывать в верхний пост, да бы топик не засорять.

Спустя 1 минута, 1 секунда (15.01.2011 - 16:19) Игорь_Vasinsky написал(а):
А почему такая структура массивов то?
Упорядочить же можно.


ответ в верхнем топике через минут 10 кикну пост.

Спустя 5 секунд (15.01.2011 - 16:19) inpost написал(а):
Joker
Да там понятно, сейчас пытаюсь составить логарифм =) Каждый последующий $i для $j%2 !=0 будет равен средней арифметической двум предыдущим

Спустя 4 минуты, 58 секунд (15.01.2011 - 16:24) Игорь_Vasinsky написал(а):
да.... это поход - вывод - участников.

Спустя 6 минут, 39 секунд (15.01.2011 - 16:30) Joker написал(а):
насамом деле этого массива вообще не существует, но для задачи пришлось выдумать чтоб обьянить что требуется.

На самом деле есть 3 массива с учасниками:
Цитата
Array
(
    [5] => Array
        (
            [0] => x8-root207-45-5-41
            [1] => x8-root208-45-5-41
            [2] => x8-root209-46-5-42
            [3] => x8-root210-46-5-42
            [4] => x8-root211-47-5-43
            [5] => x8-root212-47-5-43
            [6] => x8-root213-48-5-44
            [7] => x8-root214-48-5-44
        )

    [4] => Array
        (
            [0] => x8-root208-43-4-39
            [1] => x8-root210-43-4-39
            [2] => x8-root212-44-4-40
            [3] => x8-root214-44-4-40
        )

    [3] => Array
        (
            [0] => x8-root210-41-3-51
            [1] => x8-root214-41-3-51
        )

)


это массивы для таблицы 15х5

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

Спустя 9 минут, 7 секунд (15.01.2011 - 16:40) sergeiss написал(а):
Цитата (inpost @ 15.01.2011 - 17:19)
сейчас пытаюсь составить логарифм =)

Может, все-таки алгоритм? smile.gif

Joker - а ты попробуй с другой немного стороны зайти. Ты идешь сразу со стороны индекса $i. Но твои картинки подсказывают другое решение, что надо начинать с индекса $j:
1. $j только нечетный.
2. Для $j=1 берем все нечетные $i.
3. Для $j=3 берем первое $i=2 и далее с шагом 4.
4. Для $j=5 берем первое $i=4 и далее с шагом 8.
5. $j=7 : $i=8 и далее с шагом 16....

По-моему, закономерность есть smile.gif Шаг для $i равен $step=2^($j-1) (2 в этой степени).

Ну, а для стартового $i сам подумай, тут тоже что-то просится, связанное с двойкой и величиной $j... Если я правильно вижу, то тут будет 2 в степени шага, деленного на 4. То есть, $i_start=2^($step/4)... Или что-то около этого. А на самом деле мне нужно срочно по делу одному важному ехать, так что я побежал (некогда уже больше думать над этой задачей; через часа 2-3 вернусь).

Спустя 30 минут, 58 секунд (15.01.2011 - 17:11) inpost написал(а):
Создаю =) Так, на всякий случай сохраняю всё, что придумал =)
$i = (16 учасников - 1) (max)
$j = ??? (max)

// $j = 1;
for($temp = 1, $temp == $i, $temp++)
{
if($temp%2 != 0)
{
$array1 = $temp;
}
}

// $j = 3, и т.д. для $j которые нечётные и не равны 1!
//Можно в функцию. Новые массивы (array1,array2,array3)
//будут хранить $i в таблице, а $j мы запускаем перебором общим

foreach($array1 as $v)
{
if(!empty($tempus1))
{
$array2 = (($v + $tempus1)/2);
unset($tempus1);
}
else
{
$tempus1 = $v;
}
}


Сам же вывод в таблицу: номеруй колонки и строки таблицы при создании.
Ну а далее для каждой $j мы имеем массив с переменными $i, осталось лишь подставить.

Спустя 1 час, 37 минут, 49 секунд (15.01.2011 - 18:48) Joker написал(а):
sergeiss

Большое спасибо, всё получилось.

inpost

А тебе спасибо за старание.

Вот то что получилось:
<?php 
$max = $data['max'];
$max *= 2;
$max--;

$maxLvlW = count($data['grids']['w']);
$maxLvlWR = $maxLvlW;
$maxLvlW *= 2;
$maxLvlW--;

echo '$max=',$max,' $maxLvlW=',$maxLvlW;

core::cfg()->advanced->logIgnorStopPhpErrorsForece = true;

$starts = array();
$steps = array();
$winner = array();
?>
<table style="border-collapse:separate; border-spacing:5px;">
<?php for ($i=1;$i<=$max;$i++): ?>
<tr>
<?php
$step = 0;
?>
<?php
for ($j=1;$j<=$maxLvlW;$j++): ?>

<?php

$td_lines = $j%2 == 0;

if ($td_lines == false)
{
$step++;
}

if (!isset($winner[$step]))
{
$winner[$step] = 0;
}

$showJ = false;
$showI = false;



$showJ = $j%2 == 1;


if ($j == 1)
{
$showI = $i%2 == 1;
}
elseif ($i >= pow(2,($step-1)) && $step != 1)
{
if (!isset($starts[$step]))
{
$starts[$step] = pow(2,($step-1));
}

if ($starts[$step] == $i)
{
$showI = true;
$steps[$step] = $starts[$step] + pow(2,$step);
}
elseif ($i == $steps[$step])
{
$showI = true;
$steps[$step] += pow(2,$step);
}

//$showI = true;
}


$show = $showI && $showJ;

if ($show == true)
{
$k = $winner[$step];
$winner[$step]++;

$t = $maxLvlWR+3-$step;
}

?>


<?php
if ($td_lines == true): ?>

<td style="padding:3px; width:25px; height:25px; color:black; background:white; border:1px solid red; font-size:15px;">& nbsp;</td>

<?php elseif ($show == true): ?>

<td style="padding:3px; min-width:150px; height:25px; color:black; background:white; border:1px solid red; font-size:15px;"><?php echo $data['grids']['w'][$t][$k]; ?></td>

<?php else: ?>

<td style="padding:3px; min-width:50px; height:25px; color:black; background:white; border:1px solid red; font-size:15px;">& nbsp;<?php //echo '$i=',$i,' $j=',$j,' w=',($maxLvlWR+3-$step); ?></td>

<?php endif; ?>
<?php
endfor; ?>
</tr>
<?php endfor; ?>
</table>

Спустя 35 минут, 21 секунда (15.01.2011 - 19:24) sergeiss написал(а):
Цитата (Joker @ 15.01.2011 - 19:48)
sergeiss

Большое спасибо, всё получилось.

"Спасибо сгущенкой не пахнет!" wink.gif

Спустя 1 час, 3 минуты, 41 секунда (15.01.2011 - 20:27) Joker написал(а):
Цитата (sergeiss @ 15.01.2011 - 21:24)
"Спасибо сгущенкой не пахнет!"

Намёк понел wink.gif
Слушаю ваши пожелания)

Спустя 2 минуты, 42 секунды (15.01.2011 - 20:30) Joker написал(а):
Задача слегка усложнилась:
Теперь нужно вывести не просто значения а еще доп инфу....
то что нужно в атттаче, sergeiss подсобишь еще с идей?

Нужно вывести циферки... как показанно на картинке.

Спустя 1 минута, 33 секунды (15.01.2011 - 20:32) inpost написал(а):
Joker
После именин всегда ломка по сладостям... Намекнул же, что "сгущенку" хочет человек =)

Спустя 2 минуты, 22 секунды (15.01.2011 - 20:34) inpost написал(а):
Joker
Для всех $j, которые не равны 1 делаешь: $j-1, получаешь левые соординаты для цифры 4!
А откуда берутся другие цифры - я не понял =(

И вообще, мой алгоритм оооочень похож на Сергея, только он мудро рассказал суть, а я кодом показал эту суть =)

Спустя 10 минут, 28 секунд (15.01.2011 - 20:44) Joker написал(а):
Цифры это константы(цифры не нужно вычислять), их нужно вывести в нужных местах

Спустя 47 секунд (15.01.2011 - 20:45) Joker написал(а):
Цитата (inpost @ 15.01.2011 - 22:32)
После именин всегда ломка по сладостям... Намекнул же, что "сгущенку" хочет человек =)

Мне ему сгущенку послать что ли?)

Спустя 1 минута, 43 секунды (15.01.2011 - 20:47) sergeiss написал(а):
Цитата (Joker @ 15.01.2011 - 21:30)
Нужно вывести циферки... как показанно на картинке.

Ну дык... И кто мешает? wink.gif

По-моему, тут проще некуда:
1. Цифра 4 выводится в той же строке (индекс $i), что и информация справа от неё (есть привязка к $j).
2. Количество выводимых цифр (в столбце) равно ($j+1), т.е. просто равно $j того столбца, который справа. Самая верхняя цифра 1, затем 3 до тех пор, пока не дойдем до строки, где должна быть 4, затем опять 3 и в конце 2....

Вроде как просто получается?

Спустя 6 минут, 27 секунд (15.01.2011 - 20:53) inpost написал(а):
Они там разные, вверху одни, внизу другие. Они не связаны с основным выводом?

Спустя 1 минута, 11 секунд (15.01.2011 - 20:55) inpost написал(а):
В целом я бы сформировал один огромный массив, и в каждой ячейке проверял, если массив с номером ячейки существует - то выводить туда.

Спустя 1 минута, 55 секунд (15.01.2011 - 20:57) Joker написал(а):
Цитата (sergeiss @ 15.01.2011 - 22:47)
Вроде как просто получается?

Ага а если учесть что таблиц в html строится не по столбцам а по строкам и заранее нету расчета на следующий столбец... хотя можно попробовать вычислить потопал пробовать)

Спустя 20 минут, 56 секунд (15.01.2011 - 21:17) sergeiss написал(а):
Цитата (Joker @ 15.01.2011 - 21:57)
Ага а если учесть что таблиц в html строится не по столбцам а по строкам и заранее нету расчета на следующий столбец... хотя можно попробовать вычислить потопал пробовать)

"А чего его пробовать? Сало як сало" smile.gif

Кто тебе мешает создать 2-мерный массив, который заполняешь сначала, а по окончании обработки создаешь таблицу??? Прямо как чечачо какой-то... wink.gif

Спустя 8 минут, 9 секунд (15.01.2011 - 21:26) inpost написал(а):
sergeiss
Опять тоже самое...

Спустя 2 часа, 19 минут, 2 секунды (15.01.2011 - 23:45) Joker написал(а):
sergeiss
[b]inpost[b]
Сделал как и сказали набил массив после его форичами вывел)


А теперь пошли ягодки)

другая сторона таблицы)

в аттаче. время 2 олова не варит если есть у кого какие идеи кидайте.

Спустя 47 минут, 58 секунд (16.01.2011 - 00:33) inpost написал(а):
Joker
Узнай полную длину: 15, и поверни в обратную сторону.
Где было 15 - стало 1, где было 14 - стало 2.
x=16; // (длина)
$j = $x - $j; //Было 15, стало 1, было 13 - стало 3.


И ещё, выстави тут готовый код =) Мне аж самому стало интересно, как ты реализовал.

Спустя 9 часов, 33 минуты, 59 секунд (16.01.2011 - 10:07) Joker написал(а):
Чот до меня не дошло как ты хочешь сделать.

Спустя 3 часа, 7 минут, 53 секунды (16.01.2011 - 13:14) Joker написал(а):
все отдыхают?) или не кто не знает?)

Спустя 2 часа, 41 минута, 26 секунд (16.01.2011 - 15:56) inpost написал(а):
Joker
Спим! Я только в 2 часа дня проснулся. Ты сделай не справа на лево, а слева направо. (только в этот раз по четным числам $j==1).
Когда получится зеркальное изображение слева направо, тогда перенеси в обратную сторону по проекции.
Вот смотри, максимальное число $j = 15 (то есть в таблице всего 15 колонок).
Тогда кол. колонок +1 (ответ 16). И ко всему массиву применяешь следующую формулу.
$j = 16 - $j.
Если в том виде она была: $j =1, $i = 1, то по этой формуле уже $j = 15, $i = 1; Как раз зеркально отобразилась по оси X ($j)

Спустя 7 дней, 19 часов, 38 минут, 26 секунд (24.01.2011 - 11:34) Joker написал(а):
Я сделал еще проще) покажу сегодня завтра.
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.