если мне нужно обработать все массивы в многомерном массиве после пропуска первого, как я могу это сделать?
в этом случае добавляем + 5 к каждому значению. что, если я хочу начать со второго массива $ mdarr [1] <
cls
$mdarr = @()
$i = @()
$ii = @()
$mdarr = @((0,1,2,3,4),(5,6,7,8,9),(10,11,12,13,14))
for ($i = 0; $i -lt $mdarr.Length; ++$i){
for ($ii = 0; $ii -lt $mdarr[$i].Length; ++$i){
$mdarr = $mdarr[$i][$ii] + 5
}
}
write-host $mdarr
в вышесказанном так много неправильного. результат, который я ищу, должен быть:
((0,1,2,3,4),(10,11,12,13,14),(15,16,17,18,19))
как бы это сделать?



Проблема в обновлении содержимого массива. Все, что нужно, - это вложенный цикл для обработки элементов во внутренних массивах с соответствующей индексацией. Вот так,
$mdarr = @((0,1,2,3,4),(5,6,7,8,9),(10,11,12,13,14))
for($i = 1; $i -lt $mdarr.Length; ++$i) {
for($j = 0; $j -lt $mdarr[$i].Length; ++$j) {
$mdarr[$i][$j] += 5
}
}
$mdarr[1]
10
11
12
13
14
Что касается того, почему не сработал оригинал, давайте проанализируем код и посмотрим, что было не так:
# This starts from 1st element (index 0), which was to be skipped. Bug
for ($i = 0; $i -lt $mdarr.Length; ++$i){
# Loop counters $ii and $i are confusing, name is almost same
# What's more, $i is increased instead of $ii. Bug
for ($ii = 0; $ii -lt $mdarr[$i].Length; ++$i){
# This doesn't make sense. It's overwriting the whole
# source array-of-arrays with a single value.
# The array cell was to be updated instead. Bug
$mdarr = $mdarr[$i][$ii] + 5
}
}
Подводя итог, идея была. Из-за ошибок индексации и несоответствующей операции присваивания результат был неверным. Тем не менее, исправить довольно просто, поскольку основная логика была в порядке.
оказывается, мой ввод для цикла был ошибочным. Мне пришлось обернуть команду в @(), чтобы вернуть массив, а не скалярный объект.
я просто столкнулся с ситуацией, когда это дало бы мне ошибку, если бы массив содержал только одно значение.
Unable to index into an object of type System.Int32., что нужно настроить?