Что нового

Массивы Модификация Array Массива

aptyp

Новичок
Сообщения
36
Репутация
0
Есть ли способ модифицировать данные в массиве?

Например

В массиве очень много ссылок без префикса "http:"

//ссылка-1.ком
//ссылка-2.ком
//ссылка-3.ком

Как добавить префикс "http:" сразу ко всем ссылкам?

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

Какой самый простой и лучший способ?
 

Webarion

Осваивающий
Сообщения
143
Репутация
24
Думаю, проще некуда:
Код:
#include <Array.au3>; для _ArrayDisplay

; --- Создаём массив для примера ---
Local $aArray[0]
For $i = 0 To 999; в массиве 1000 элементов
    ReDim $aArray[UBound($aArray) + 1]; увеличиваем размер массива
    $aArray[$i] = Random(0, 5, 1) = 5 ? 'просто текст' : '//ссылка-' & $i + 1 & '.ком'; записываем данные в массив, чтобы были не только ссылки, но и простой текст
Next
;-----------------------------------

_ArrayDisplay($aArray); после появления окна, для продолжения закрыть его

; --- Преобразуем массив -----------
For $i = 0 To UBound($aArray) - 1; перебираем весь массив
    $aArray[$i] = StringRegExpReplace($aArray[$i], '^//', 'http://'); замена каждого элемента в массиве, с помощью регулярного выражения
Next
;-----------------------------------

_ArrayDisplay($aArray); показываем преобразованный массив
 
Автор
aptyp

aptyp

Новичок
Сообщения
36
Репутация
0
Я по своему невежеству, вместо
Код:
For...To...Step...Next

использовал
Код:
For...In...Next

И долго не понимал, почему не происходит замена данных.

Например так не работает почему то.

Код:
Local $aArray[50]
For $i = 0 To 50 - 1
    $aArray[$i] = '//link-' & $i + 1 & '.xxx'
 Next

 For $i In $aArray
    ConsoleWrite("http:" & $i & @CRLF)
    $i = "http:" & $i
Next

_ArrayDisplay($aArray)


В консоль выводится с заменой, а в массиве замена не происходит.
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
for...in это получение данных из объектов. ибо там данные меняются по другим функциям
 
Автор
aptyp

aptyp

Новичок
Сообщения
36
Репутация
0
Как там меняются данные? Это как когда чувствуешь, что так должно работать, а не работает.
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
например, Scripting.Dictionary
подробно в русской справке или ТУТ
 
Автор
aptyp

aptyp

Новичок
Сообщения
36
Репутация
0
Ассоциативный массив получается, поэтому не получается.
Массивы AutoIt внутри выражения For...In доступны только для чтения. Присвоить значение переменной внутри выражения For...In возможно, однако, это изменение никак не скажется на самом массиве. Чтобы иметь возможность модифицировать содержание массива используйте цикл For...To.
 

Webarion

Осваивающий
Сообщения
143
Репутация
24
Например так не работает почему то.

Объяснение:
Код:
#include <Array.au3>

Local $aArray[50]
For $i = 0 To 50 - 1
    $aArray[$i] = '//link-' & $i + 1 & '.xxx'
Next
;Задали массив

For $i In $aArray; перебираем массив, здесь в цикле For создаётся новая переменная $i и она получает каждый элемент массива $aArray по очереди.
    ConsoleWrite("http:" & $i & @CRLF); здесь мы выводим в консоль, желаемое
    ; переменная $i, не привязана к массиву, это просто новая пемеменная в которую было извлечено, одно значение из массива.
    ; при каждом новом цикле, эта переменная обновляется.
    $i = "http:" & $i; здесь в переменную $i записывается, то, что нужно, но это не зависывается в сам массив $aArray
Next
_ArrayDisplay($aArray, 'Пример1'); поэтому массив $aArray, остался прежним, в цикле он не был перезаписан. Это была работа в пустую


; если есть желание использовать In в цикле For, то необходимо использовать индексы массива, например так:
Local $aArr = $aArray; создаём новый массив из старого, чтобы первый оказался не тронутым. Нужно для следующего примера. В этом примере работаем с $aArr
Local $i = 0; первый индекс массива, задаётся вне цикла
For $var In $aArr; перебираем массив, $var получает каждый элемент массива по очереди, в каждом новом цикле
    $aArr[$i] = "http:" & $var; обновляем ячейку массива с индексом $i
    $i += 1; увеличиваем индекс массива на единицу
Next
_ArrayDisplay($aArr, 'Пример2'); показываем обновлённый массив

; Но это не самое простое решение. In в цикле For используется в специфических решениях,
; когда можно перебрать элементы, но нет необходимости использовать номера их индексов
; В большинстве же случаев, наиболее простым решением будет следующее:
For $i = 0 To UBound($aArray) - 1
    $aArray[$i] = "http:" & $aArray[$i]; можно так, если точно известно, что все элементы массива, являются //link-n.xxx, иначе, это будет неправильным решением
Next
_ArrayDisplay($aArray, 'Пример3')

; существует ещё одно рещение, бывает, что в первом элементе массива, записано количество рабочих элементов, тогда пример может выглядеть следующим образом
Local $sData = '//link-1.xxx|//link-2.xxx|//link-3.xxx|//link-4.xxx|//link-5.xxx|//link-6.xxx|//link-7.xxx|//link-8.xxx|//link-9.xxx'; готовим для нового массива
Local $aArray = StringSplit($sData, '|'); создаём массив из строки
For $i = 1 To $aArray[0]; это единственное отличие, от предыдущего примера. Указываем размер цикла из первого элемента массива
    $aArray[$i] = "http:" & $aArray[$i]; подобно предыдущему примеру
Next
_ArrayDisplay($aArray, 'Пример4')

; Если есть необходимость удалить первый элемент массива и получить чистый набор рабочих элементов. По аналогии с предыдущим примером:
Local $sData = '//link-1.xxx|//link-2.xxx|//link-3.xxx|//link-4.xxx|//link-5.xxx|//link-6.xxx|//link-7.xxx|//link-8.xxx|//link-9.xxx'
Local $aArray = StringSplit($sData, '|')
For $i = 0 To $aArray[0]-1; здесь уже отсчёт от нулевого индекса, так как в него будем записывать
    $aArray[$i] = "http:" & $aArray[$i+1]; просто переносим следующую ячейку в текущую, и записываем её с новым значением
Next
ReDim $aArray[UBound($aArray)-1]; Уменьшаем размер массива. Эту строку можно закомментировать, чтобы увидеть её необходимость.
_ArrayDisplay($aArray, 'Пример5')

; Равнозначный вариант, предыдущего примера, это на любителя:
Local $sData = '//link-1.xxx|//link-2.xxx|//link-3.xxx|//link-4.xxx|//link-5.xxx|//link-6.xxx|//link-7.xxx|//link-8.xxx|//link-9.xxx'
Local $aArray = StringSplit($sData, '|')
For $i = 1 To $aArray[0]; здесь уже отсчёт от первого индекса
    $aArray[$i-1] = "http:" & $aArray[$i]; переносим текущую ячейку в предыдущую, и записываем её с новым значением
Next
ReDim $aArray[UBound($aArray)-1];
_ArrayDisplay($aArray, 'Пример6')
 
Последнее редактирование:
Верх