Что нового

[Массивы] Создание двумерного массива на основе двух других

---Zak---

Скриптер
Сообщения
455
Репутация
120
Добрый день всем...

Нуждаюсь в небольшой помощи от Вас. Все еще продолжаю разработку связанные с методами по работе с API для портала vk.com (проект здесь).

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

Два массива...
HF3cTHKYoeE.jpg

Пока сижу вот так - :stars:. Если посмотрите скрин - в зеленой рамке выделил момент:
Возвращает массив из объектов с аудиозаписями пользователя, каждый из которых имеет поля aid, owner_id, artist, title, duration, url. Если у аудиозаписи есть текст, возвращается идентификатор текста lyrics_id. Если аудиозаписи присвоен альбом, возвращается идентификатор альбома album. owner_id равен id пользователя, если аудиозаписи принадлежат пользователю, или -id группы, если аудиозаписи принадлежат группе.

ЗЫ: идея одна есть: смотреть какое поле у тебя сейчас и сравнивать название полей с [**][1] и составлять уже по этому приницу, но...тут надо посидеть :scratch:

Что хотелось бы получить многомерный массив, где в первой строке будут название полей, а в последующих уже будет сама информация. Т.е. получается массив будет создан [**][7]... а в тех моментах, где должно получиться [**][6] - в готовом должен быть пропуск одного элемента...

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

C2H5OH

AutoIT Гуру
Сообщения
1,473
Репутация
333
Это?
Код:
#Include <Array.au3>

Dim $aTitle[$N], $aContent[$N] ; сам понимаешь, тут надо поработать

Dim $aCatalog[$m][7]
Global $index = 0

For $i = 1 To UBound($aTitle)-1
	Switch $aTitle[$i]
		Case "aid"
			$index +=1
			$aCatalog[$index][0] = $aContent[$i]
		Case "owner_id"
			$aCatalog[$index][1] = $aContent[$i]
		Case "artist"
			$aCatalog[$index][2] = $aContent[$i]
		Case "title"
			$aCatalog[$index][3] = $aContent[$i]
		Case "duration"
			$aCatalog[$index][4] = $aContent[$i]
		Case "url"
			$aCatalog[$index][5] = $aContent[$i]
		Case "lyrics_id"
			$aCatalog[$index][7] = $aContent[$i]
	EndSwitch
Next
_ArrayDisplay($aCatalog)
 
Автор
---Zak---

---Zak---

Скриптер
Сообщения
455
Репутация
120
2 C2H5OH
Почти, но здесь ты так же указываешь названия ручками:
Код:
Case "aid"
Case "owner_id"
...

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

ЗЫ: сейчас еще подробнее постараюсь написать...
 

C2H5OH

AutoIT Гуру
Сообщения
1,473
Репутация
333
Код:
#Include <Array.au3>

Dim $aTitle[$N], $aContent[$N] ; сам понимаешь, тут надо поработать

Dim $uTitle = _ArrayUnique($aTitle,1)
_ArrayDelete($uTitle,_ArraySearch($uTitle,"aid"))
$uTitle[0] = "aid"

Local $m = Ubound(_ArrayFindAll($avArray, "aid",1))
Dim $aCatalog[$m][UBound($uTitle)]
Global $index = 0

For $i = 1 To UBound($aTitle)-1
	For $j = 0 To UBound($uTitle)-1 
		If $aTitle[$i] = "aid" Then	$index +=1
		$aCatalog[$index][$j] = $aContent[$i]
	Next
Next
_ArrayDisplay($aCatalog)
 
Автор
---Zak---

---Zak---

Скриптер
Сообщения
455
Репутация
120
В общем накидал два массива... как сделать начальный массив - C2H5OH - спасибо тебе - на мысль натолкнул:
Код:
_ArrayUnique


Должно получиться как-то так:
Код:
#Include <Array.au3>

Dim $ARRAY_Y [20] = ["aid", "owner_id", "artist", "title", "duration", "url", "lyrics_id", "aid", "owner_id", "artist", "title", "duration", "url", "aid", "owner_id", "artist", "title", "duration", "url", "lyrics_id"]
	_ArrayDisplay($ARRAY_Y)
Dim $ARRAY_Y2[20] = ["aid_01", "owner_id_01", "artist_01", "title_01", "duration_01", "url_01", "lyrics_id_01", "aid_02", "owner_id_02", "artist_02", "title_02", "duration_02", "url_02", "aid_03", "owner_id_03", "artist_03", "title_03", "duration_03", "url_03", "lyrics_id_03"]
	_ArrayDisplay($ARRAY_Y2)

Dim $ARRAY_ASD[4][7]

$ARRAY_ASD[0][0] = "aid"
$ARRAY_ASD[0][1] = "owner_id"
$ARRAY_ASD[0][2] = "artist"
$ARRAY_ASD[0][3] = "title"
$ARRAY_ASD[0][4] = "duration"
$ARRAY_ASD[0][5] = "url"
$ARRAY_ASD[0][6] = "lyrics_id"

$ARRAY_ASD[1][0] = "aid_01"
$ARRAY_ASD[1][1] = "owner_id_01"
$ARRAY_ASD[1][2] = "artist_01"
$ARRAY_ASD[1][3] = "title_01"
$ARRAY_ASD[1][4] = "duration_01"
$ARRAY_ASD[1][5] = "url_01"
$ARRAY_ASD[1][6] = "lyrics_id_01"

$ARRAY_ASD[2][0] = "aid_02"
$ARRAY_ASD[2][1] = "owner_id_02"
$ARRAY_ASD[2][2] = "artist_02"
$ARRAY_ASD[2][3] = "title_02"
$ARRAY_ASD[2][4] = "duration_02"
$ARRAY_ASD[2][5] = "url_02"


$ARRAY_ASD[3][0] = "aid_03"
$ARRAY_ASD[3][1] = "owner_id_03"
$ARRAY_ASD[3][2] = "artist_03"
$ARRAY_ASD[3][3] = "title_03"
$ARRAY_ASD[3][4] = "duration_03"
$ARRAY_ASD[3][5] = "url_03"
$ARRAY_ASD[3][6] = "lyrics_id_03"

_ArrayDisplay($ARRAY_ASD)

т.е. получается смысл такой:
Если в $ARRAY_Y 1 элемент = "aid", то записывам в новый массив в первый столбец... почему первый столбец - потому что исходя из
Код:
_ArrayUnique

мы создадим новый массив, в котором соотношения полей соответствует первому столбцу.

А если бы:
Если в $ARRAY_Y 1 элемент = "url", то записывам в новый массив в шестой столбец...

В общем мысль я понял... пойду писать пока не забыл...
 

C2H5OH

AutoIT Гуру
Сообщения
1,473
Репутация
333
Не факт что url - 6-ой столбец. Не уверен что будет на выходе _ArrayUnique
Но, то что "aid" будет на первом месте обеспечено вот такими манипуляциями
Код:
_ArrayDelete($uTitle,_ArraySearch($uTitle,"aid"))
$uTitle[0] = "aid"


Я почему-то решил что "aid" - ключевое поле и должнео быть первым...
 
Автор
---Zak---

---Zak---

Скриптер
Сообщения
455
Репутация
120
Не - все правильно - так и получается.. первый столбец ([0]) = "aid", шестой ([5]) = "url"
Код:
#Include <Array.au3>

Dim $ARRAY_Y [20] = ["aid", "owner_id", "artist", "title", "duration", "url2", "lyrics_id", "aid", "owner_id", "artist", "title", "duration", "url", "aid", "owner_id", "artist", "title", "duration", "url", "lyrics_id"]
;~ 	_ArrayDisplay($ARRAY_Y)

Dim $AUNIQ = _ArrayUnique($ARRAY_Y)
;~ 	_ArrayDisplay($AUNIQ)
	$C_AUNIQ = $AUNIQ[0]

Dim $ARRAY_ASD[1][$C_AUNIQ]
	For $i = 1 To $C_AUNIQ
		$ARRAY_ASD[0][$i-1] = $AUNIQ[$i]
	Next

;~ 	For $i = 0 To $ARRAY_Y
Local $iIndex = _ArraySearch($AUNIQ,$ARRAY_Y[12])
		ConsoleWrite("["&$iIndex-1&"]")
	_ArrayDisplay($ARRAY_ASD)

Дела в том, что я не хочу нигде упоминать название столбцов... т.е. должно идти сравнение массивов и запись результатов в итог.

"aid" - в данном случае ключевое, т.к. оно первое в массиве, хотя по сути - это не имеет значение для функции.

Идея посторить массив по принципу - удаляем все совпадения в массиве названия полей ($ARRAY_Y). Далее берем создаем массив ($ARRAY_ASD) исходя из данных удаления совпадений массива (см. пример). Далее возвращаемся к массиву с полями ($ARRAY_Y) и берем первый элемент (в данном случае это "aid") - Ищем в $ARRAY_ASD в первой строке название такого поля... ага - это у нас первый столбец ([0]) и в конец массива заносим данные исходя из = т.к. мы брали первый элемент массива - в $ARRAY_Y2 возьмем так же первый элемент массива.

И в первом исходном и во втором исходном массиве - кол-во элементов одинаковое...

ЗЫ: немного изменил скрипт - ам в консоли будет как-раз номер элемента $ARRAY_Y[12] в $ARRAY_ASD
Код:
$ARRAY_Y[12] = "url"
 
Верх