Author Topic: Конкатенация имени переменной (имени массива) используя скрипт.  (Read 7179 times)

0 Members and 1 Guest are viewing this topic.

Torari

  • Зашел в гости
  • *
  • Posts: 18
    • View Profile
Что-то меня переклинило, помогите разобраться. Допустим, объявляю в "ручную" переменные.
Code: [Select]
$var_1 = значение_1
$var_2 = значение_2
$var_3 = значение_3
Далее выполняется код. И тут внезапно, бах, у меня появилась нужда в переменных $var_4, $var_5, $var_6, которые я крайне редко использую. И переменные срочно нужно создать и срочно положить туда значения. Что бы с ними дальше работать. Что-то типа нижележащего примера, но в таком виде скрипт не работает.
Code: [Select]
$i=4
For($i, $i<8)
$var_$i = значение_$i
End_cyc
Я понимаю, что пример для 7ми переменных выглядит, мол, "бери и объявляй" в ручную. Но для случая, где ~70 переменных, в которых обычно скрипт используют ~20, а остальные переменные болтаются "баластом" и нужны лишь в редких случаях (но эти случаи встречаются). Как-то скрипт выглядит громоздко.

Аналогичная вещь нужна для массивов.
Code: [Select]
$arr_1[0] = значение_1_0
$arr_1[1] = значение_1_1
$arr_1[2] = значение_1_2

$arr_2[0] = значение_2_0
$arr_2[1] = значение_2_1
$arr_2[2] = значение_2_2
Code: [Select]
$i=3
For($m, $m<8)
$arr_$m[0] = значение_$m_0
$arr_$m[1] = значение_$m_1
$arr_$m[2] = значение_$m_2
End_cyc
Вот такие заморочки)
« Last Edit: March 27, 2014, 12:41:42 PM by Torari »

Oraven

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3685
  • Котэ
    • View Profile
Пиши код правильно и никаких
Quote
внезапно, бах, у меня появилась нужда
не будет.  8)

Torari

  • Зашел в гости
  • *
  • Posts: 18
    • View Profile
 ;D Динамически изменяется потребность в переменных. Я тут не причем, жизнь такая.)
« Last Edit: March 27, 2014, 01:49:11 PM by Torari »

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
В имени переменной не может быть другой переменной.
Что за надобность такая?
В первом варианте, вместо нумерованных элементов нужно применять массив с индексами. Он для этого и создан.
Во втором вообще не понятно... действительно нужно столько массивов? И ты не знаешь их количества и их размера?
Если знаешь размеры - создавай многомерный массив (псевдо).


Torari

  • Зашел в гости
  • *
  • Posts: 18
    • View Profile
Quote
Что за надобность такая?
Несколько раз меня на мысль такую наводили несколько разных случаев в разное время. Вот решил задать вопрос в общем, без привязки к конкретике. Сейчас попробую сформулировать с конкретикой. Только просьба не смеяться, я не программист. )

Случай 1ый. Есть значения результатов. Их можно сгруппировать по смыслу a, b, c, d, e.
Code: [Select]
a_1, a_2, a_3 и тд
b_1, b_2, b_3 и тд
c_1, c_2, c_3 и тд
d_1, d_2, d_3 и тд
e_1, e_2, e_3 и тд
и тд_1, и тд_2, и тд_3 и тд
Эти результаты со сторонней программы приходят в файлы. Причем приходят результаты не по порядку, а абсолютно хаотично.
Code: [Select]
a_3, a_2, a_1, a_5, a_4 и тд
b_1, b_3, b_4, b_2, b_5 и тд
c_2, c_3, c_1, c_5, c_4 и тд
d_5, d_4, d_3, d_2, d_1 и тд
e_4, e_3, e_1, e_5, e_2 и тд
и тд_1, и тд_2, и тд_3 и тд
Причем, за каждую "итеррацию" (надеюсь так можно выражаться в приличном обществе) приходит разное количество результатов. Как в одну сторону a, b, c, d, e, f и тд... так и в другую 1,2,3,4,5,6 и тд

Может быть так:[spoiler]Может быть так:
Quote
a_1, a_2
b_1, b_1
c_2, c_1
d_2, d_1
e_1, e_2
f_1, f_2
g_1, g_2
h_1, h_2
Или быть так:
Quote
a_3, a_2, a_1, a_7, a_4, a_6, a_5
b_1, b_3, b_6, b_4, b_2, b_5, b_7
c_2, c_3, c_1, c_7, c_5, c_6, c_4
Или вообще так:
Quote
a_3, a_2, a_1, a_5, a_4
b_1, b_3, b_4, b_2, b_5
c_2, c_3, c_1, c_5, c_4
d_5, d_4, d_3, d_2, d_1
e_4, e_3, e_1, e_5, e_2
[/spoiler]

Как я поступаю. (Возможно я поступаю мегобредово, тут уж не обессудьте.).
[spoiler]
Я забираю из файлов поочередно пачки результатов, в массивы. Огромное спасибо Atas, который научил меня это делать здесь.
Quote
$arr_a[0] = a_3
$arr_a[1] = a_2
$arr_a[2] = a_1
$arr_a[3] = a_5
$arr_a[4] = a_4
Quote
$arr_b[0] = b_1
$arr_b[1] = b_3
$arr_b[2] = b_4
$arr_b[3] = b_2
$arr_b[4] = b_5
Quote
$arr_c[0] = c_2
$arr_c[1] = c_3
$arr_c[2] = c_1
$arr_c[3] = c_5
$arr_c[4] = c_4
Quote
$arr_d[0] = d_5
$arr_d[1] = d_4
$arr_d[2] = d_3
$arr_d[3] = d_2
$arr_d[4] = d_1
Quote
$arr_e[0] = e_4
$arr_e[1] = e_3
$arr_e[2] = e_1
$arr_e[3] = e_5
$arr_e[4] = e_2
[/spoiler]

Далее, чтобы гонять эти значения по скриптам (циклам), у меня потребность возникает сгруппировать эти результаты в том виде, в котором я их представляю в голове.
[spoiler]
Для этого мне нужны еще массивы.
Quote
$arr_1[0] = a_1
$arr_1[1] = b_1
$arr_1[2] = c_1
$arr_1[3] = d_1
$arr_1[4] = e_1
Quote
$arr_2[0] = a_2
$arr_2[1] = b_2
$arr_2[2] = c_2
$arr_2[3] = d_2
$arr_2[4] = e_2
Quote
$arr_3[0] = a_3
$arr_3[1] = b_3
$arr_3[2] = c_3
$arr_3[3] = d_3
$arr_3[4] = e_3
Quote
$arr_4[0] = a_4
$arr_4[1] = b_4
$arr_4[2] = c_4
$arr_4[3] = d_4
$arr_4[4] = e_4
Quote
$arr_5[0] = a_5
$arr_5[1] = b_5
$arr_5[2] = c_5
$arr_5[3] = d_5
$arr_5[4] = e_5
[/spoiler]

Но получается, что за каждую итеррацию, я не знаю заранее сколько у меня массивов вида ($arr_a, $arr_b, $arr_c, $arr_d, $arr_e и тд) и сколько массивов вида ($arr_1, $arr_2, $arr_3, $arr_4, $arr_5, $arr_6, $arr_7, $arr_8 и тд)

Случай 2ой. Менее печальный и более предсказуемый. Но мысли возникают, про "облегчение жизни". К примеру, есть файл, в нем таблица.

[spoiler]
заголовок_1     заголовок_2      заголовок_3
значение_1_1   значение_2_1    значение_3_1
значение_1_2   значение_2_2    значение_3_2
значение_1_3   значение_2_3    значение_3_3
[/spoiler]

При извлечении результатов, хочется, при объявлении переменных, не вводить имена переменных вручную. А брать имена для переменных сразу из шапок таблиц в готовом виде. Т.к. таблиц у меня много, всяких разных. Если это не автоматизировать, то с моей запредельной внимательностью и вселенской концентрацией внимания, просто тонна ошибок льется.
[spoiler]$заголовок_1
$заголовок_2
$заголовок_3
Или для массивов.
$arr_заголовок_1
$arr_заголовок_2
$arr_заголовок_3[/spoiler]
« Last Edit: March 27, 2014, 05:28:56 PM by Torari »

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Ты случаем не из экселя выковыриваешь? Кликер немного не для этого предназначен. Но если очень хочется то можно и с этим разобраться.
Только подход не верный. Динамические имена полная ерунда, не зря их нельзя создавать. Создание переменных в памяти кликера ведь не конечная цель. Их же нужно потом обрабатывать. И как ты будешь обращаться к переменой имени которой не знаешь? Возьми то, не знаю что.
Например как ты узнаешь что можно обращаться к h_6? Вдруг последняя e_5... Значит нужно ещё переменные которые будут считать и запоминать размерность. Ну и нафига тогда все танцы с именами если в итоге у тебя тот же двумерный массив с индексами.


Johnny

  • Создатель
  • Герой форума
  • *
  • Posts: 593
    • View Profile
в принципе, я видел такое в одном языке (это был ActionScript для флеша). и выглядело это примерно так (абстрактно):

Code: (clickermann) [Select]
// случай 1
setvar("$newvar", 10)

print($newvar) // выводит 10
print( getvar("$newvar") ) // выводит ту же 10

// случай 2
for($i=1, $i<4)
  setvar("$var"+$i, $i) // создаются переменные $var1=1, $var2=2, $var3=3
end_cyc

for($i=1, $i<4)
  print( getvar("$var"+i) ) // выводится соотв. "1", "2", "3"
end_cyc

но концептуально это ничего не дает, потому что это опять же либо обращение по имени, либо по индексу. только через красивый расписной костыль.
честно говоря соглашуть с предыдущим оратором: автор немного сам недопонял чего ему хочется. ни в С к слову ни в Паскале такого костыля как я привел в примере нет и как то живут люди. даже в самом ActionScript это просто алтернативный способ обращения, который реально помогает лишь в одном случае: если вы (такой сякой) вместо массива $var[] используете кучу переменных вида $var1, $var2, $var3 ...
нужно просто пересмотреть алгоритмы, я думаю.

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

4 5 6 4 6 0 4 5 3 0 4 7 4 3 2 5 6 2 0

тут как видно три подмассива в одном массиве, при этом они все разной длины. но они разделены однозначным разделительным элементом - 0. а поэтому нет вообще никаких проблем ни с подсчетом числа подмассивов ни с однозначным определением границ подмассивов. и все это в рамках стандартного одномерного массива.
« Last Edit: March 28, 2014, 07:28:41 AM by Johnny »

Torari

  • Зашел в гости
  • *
  • Posts: 18
    • View Profile
Oraven, Vint, Johnny
Спасибо за содержательные ответы. Попробую переосмыслить алгоритмы.

зы
Я совсем ничего непонимаю про псевдомногомерные массивы. Допустим, есть переменные вида "a" и переменные вида "b". Как их положить в один массив? (Еще предположим, что нулем у меня не мб разделение, ибо встречается ноль в качестве значений. Пусть разделением будет косая черта)

$a_1 = 11
$a_2 = 12
$a_3 = 13
$a_4 = 14

$b_1 = 345
$b_2 = 346
$b_3 = 347
$b_4 = 347

Так?
Code: [Select]
$arr[0] = $a_1
$arr[1] = $a_2
$arr[2] = $a_3
$arr[3] = $a_4
$arr[4] = "/"
$arr[5] = $b_1
$arr[6] = $b_2
$arr[7] = $b_3
$arr[8] = $b_4
$arr[9] = "/"

Или как-то так?
Code: [Select]
$arr[0] = $a_1,"/",$b_1
$arr[1] = $a_2,"/",$b_2
$arr[2] = $a_3,"/",$b_3
$arr[3] = $a_4,"/",$b_4

Или как-то так?
Code: [Select]
$arr[0] = STRCONCAT ($a_1,"/",$b_1)
$arr[1] = STRCONCAT ($a_2,"/",$b_2)
$arr[2] = STRCONCAT ($a_3,"/",$b_3)
$arr[3] = STRCONCAT ($a_4,"/",$b_4)

Oraven

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3685
  • Котэ
    • View Profile
правильным можно назвать первый вариант но тут переменные $a_1 и тд. вообще не нужны, данные должны сразу записываться в массив и разделяться "отделителями" при переходе на новую строку.

Совершенно непонятно что ты там делаешь....

Torari

  • Зашел в гости
  • *
  • Posts: 18
    • View Profile
 :) "переменные $a_1" это я для тренировки в отдельном сценарии, не стал усложнять скрипт циклами и прочим. Не использовать же в боевом скрипте то, что непонятно работает?

Получается, в двух мерном псевдомассиве, нужно сразу записывать значения массива (который идет первым) целиком, иначе значения первого массива потом не добавить? Печалька.
« Last Edit: March 28, 2014, 01:21:03 PM by Torari »

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Если у тебя перед заполнением массива известны его размеры, то можно создать с жёсткими размерами. Скорее всего так и есть. Ну например букв у тебя 5, а цифр 7. Вот и создавай 5 строк по 7 значений
0 1  2  3  4  5  6
0 1  2  3  4  5  6
0 1  2  3  4  5  6
0 1  2  3  4  5  6
0 1  2  3  4  5  6

В массиве они будут так:
0 1  2  3  4  5  6    0 1  2  3  4  5  6    0 1  2  3  4  5  6    0 1  2  3  4  5  6    0 1  2  3  4  5  6
Для обращения используй $arr[№колонки+№строки*длину строки]  номера начинаются от 0, длина - количество.

Для примера. Считать выделенный элемент
                 4
   0 1  2  3  4  5  6
   0 1  2  3  4  5  6
   0 1  2  3  4  5  6
3 0 1  2  3  4  5  6
   0 1  2  3  4  5  6

$arr[4+3*7]

Если у тебя в каждой "букве" разное число "цифр" Выбери самую большую и делай размер с ней
$a_1 =
$a_2 =
$a_3 =
$a_4 =

$b_1 =
$b_2 =
$b_3 =

$с_1 =
$c_2 =
...
$c_100 =

вот и делай 3х100

Как минимум один размер ты должен знать - количество символов в строке, Второй элемент - количество строк может быть динамическим (плавать)
« Last Edit: March 28, 2014, 01:26:42 PM by Vint »


Johnny

  • Создатель
  • Герой форума
  • *
  • Posts: 593
    • View Profile
какая то уйма теории и совсем непонятно как это применять. прямо Хабр какой-то.

ты бы правда написал КОНКРЕТНУЮ задачу, с конкретными примерами, входной информацией.
а то все началось уже с того что "не хватает функционала". а для чего его не хватает так и не выяснили

Torari

  • Зашел в гости
  • *
  • Posts: 18
    • View Profile
Quote
перед заполнением массива известны его размеры
Да, получается известны. Ок, буду пробовать.

Quote
а то все началось
Ну, это философский вопрос  :D с позиции профессионала, он возможно и выглядит как "не хватает функционала". Для меня (как новичка) всё выглядит в свете "не запутаться бы" и "написать скрипт, который понятен мне" и "как можно меньше залезать в профессиональные дебри".  :)
« Last Edit: March 28, 2014, 01:44:31 PM by Torari »