DyadyaGenya
Знающий
- Сообщения
- 306
- Репутация
- 10
Доброго времени суток. Возможно где-то и есть такая тема, но не нашел. По сути изначально нужно было печатать/выводить трёхмерный массив. И такие темы есть. И Не то, чтобы оно мне было очень нужно. Свою задачу по печати 3-4 уровневого массива я сделал. Но не получается сделать это универсальным. Пока имею например для 4-х мерного массива такое для вывода в консоль:
Или для печати в файл:
Ну или так:
Но хотелось бы универсальности и наглядности для многомерного массива. Ведь если верить справке, то можно создавать до 64 уровней
Я пробовал рекурсию, как я её понимаю, но получается, что нужно обращаться что-то типа $aArray[$i]. А к многомерному массиву так не обратишься.. Будет ошибка.
Пробовал использовать для цикла UBound($aArray, 0), но без особых успехов. Пока вот так:
Код:
Func printArray4dToConsole($aArray)
; Проверяем, является ли массив 4-мерным
If Not IsArray($aArray) Or UBound($aArray, 0) <> 4 Then
ConsoleWrite("Ошибка: Переданный массив не является 4-мерным." & @CRLF)
Return
EndIf
; Начинаем вывод массива
ConsoleWrite("Array" & @CRLF)
ConsoleWrite("(" & @CRLF)
For $i = 0 To UBound($aArray, 1) - 1
ConsoleWrite(" [" & $i & "] => Array" & @CRLF)
ConsoleWrite(" (" & @CRLF)
For $j = 0 To UBound($aArray, 2) - 1
ConsoleWrite(" [" & $j & "] => Array" & @CRLF)
ConsoleWrite(" (" & @CRLF)
For $k = 0 To UBound($aArray, 3) - 1
ConsoleWrite(" [" & $k & "] => Array" & @CRLF)
ConsoleWrite(" (" & @CRLF)
For $l = 0 To UBound($aArray, 4) - 1
ConsoleWrite(" [" & $l & "] => " & $aArray[$i][$j][$k][$l] & @CRLF)
Next
ConsoleWrite(" )" & @CRLF)
Next
ConsoleWrite(" )" & @CRLF)
Next
ConsoleWrite(" )" & @CRLF)
Next
ConsoleWrite(")" & @CRLF)
EndFunc
Или для печати в файл:
Код:
Func printArray4d($aArray, $sFilePath)
; Открываем файл для записи
Local $hFile = FileOpen($sFilePath, 2) ; 2 = Режим перезаписи файла
If $hFile = -1 Then
MsgBox(16, "Ошибка", "Не удалось открыть файл для записи: " & $sFilePath)
Return
EndIf
; Начинаем запись массива
FileWriteLine($hFile, "Array")
FileWriteLine($hFile, "(")
For $i = 0 To UBound($aArray, 1) - 1
FileWriteLine($hFile, " [" & $i & "] => Array")
FileWriteLine($hFile, " (")
For $j = 0 To UBound($aArray, 2) - 1
FileWriteLine($hFile, " [" & $j & "] => Array")
FileWriteLine($hFile, " (")
For $k = 0 To UBound($aArray, 3) - 1
FileWriteLine($hFile, " [" & $k & "] => Array")
FileWriteLine($hFile, " (")
For $l = 0 To UBound($aArray, 4) - 1
FileWriteLine($hFile, " [" & $l & "] => " & $aArray[$i][$j][$k][$l])
Next
FileWriteLine($hFile, " )")
Next
FileWriteLine($hFile, " )")
Next
FileWriteLine($hFile, " )")
Next
FileWriteLine($hFile, ")")
; Закрываем файл
FileClose($hFile)
EndFunc
Ну или так:
Код:
Func Write4DArrayToFile($aArray, $sFilePath, $sDelimiter)
; Проверяем, является ли массив четырёхмерным
If Not IsArray($aArray) Or UBound($aArray, 0) <> 4 Then
MsgBox(16, "Ошибка", "Переданный массив не является четырёхмерным.")
Return False
EndIf
; Открываем файл на запись
Local $hFile = FileOpen($sFilePath, 2)
If $hFile = -1 Then
MsgBox(16, "Ошибка", "Не удалось открыть файл для записи.")
Return False
EndIf
; Проходим по всем уровням массива и записываем в файл
For $i = 0 To UBound($aArray, 1) - 1
FileWriteLine($hFile, "Срез уровня 1 [" & $i & "]:")
For $j = 0 To UBound($aArray, 2) - 1
FileWriteLine($hFile, " Срез уровня 2 [" & $j & "]:")
For $k = 0 To UBound($aArray, 3) - 1
; Формируем строку для текущей строки с разделителем
Local $sLine = ""
For $l = 0 To UBound($aArray, 4) - 1
$sLine &= $aArray[$i][$j][$k][$l] & $sDelimiter
Next
; Убираем последний разделитель и записываем строку
$sLine = StringTrimRight($sLine, StringLen($sDelimiter))
FileWriteLine($hFile, " " & $sLine)
Next
FileWriteLine($hFile, "") ; Добавляем пустую строку между подуровнями
Next
FileWriteLine($hFile, "") ; Добавляем пустую строку между срезами
Next
; Закрываем файл
FileClose($hFile)
Return True
EndFunc
Я пробовал рекурсию, как я её понимаю, но получается, что нужно обращаться что-то типа $aArray[$i]. А к многомерному массиву так не обратишься.. Будет ошибка.
Пробовал использовать для цикла UBound($aArray, 0), но без особых успехов. Пока вот так:
Код:
Func MultiArray2($Array)
; Определяем количество измерений массива
Local $iDimensions = UBound($aArray, 0)
; Создаём массив-каунтер с количеством элементов, равным числу измерений
Local $aCounter[$iDimensions]
; Заполняем массив-каунтер
For $i = 0 To $iDimensions - 1
$aCounter[$i] = $i + 1 ; Индексы начинаются с 1 для измерений
Next
_ArrayDisplay($aCounter)
Local $sSpaces = _StringRepeat(" ", 4)
ConsoleWrite("Array" & @CRLF)
ConsoleWrite("(" & @CRLF)
; Начинаем запись массива
For $i = 0 To UBound($Array, 0)-1
If UBound($Array, $i) <> 0 Then
ConsoleWrite(" [" & $i & "] => Array" & @CRLF)
ConsoleWrite("(" & @CRLF)
For $j =0 To UBound($aCounter)-1
;ConsoleWrite("Количество элементов в измерении " & $i & ": " & UBound($Array, $i) & @CRLF)
ConsoleWrite($aCounter[$j] & @CRLF)
Next
ConsoleWrite(")" & @CRLF)
EndIf
Next
ConsoleWrite(")" & @CRLF)
EndFunc
Последнее редактирование: