0
votes

Modifier conditionnellement un élément de tableau sans recourir à un tableau temporaire

Étant donné un tableau comme celui-ci

$tempArray = @()
$count = 1
foreach ($item in $array) {
    $tempArray += "$item $count"
    $count ++
}
$array = $tempArray

Je peux ajouter quelque chose à la fin de chaque élément du tableau comme ceci

$array = $array | Foreach-Object {"$_ *"}

Et si je veux ajouter quelque chose de DIFFÉRENT à chaque membre, je peux le faire comme ceci

$array = @('A', 'B', 'C', 'D', 'E')

Mais cette utilisation d'un tableau temporaire semble ... maladroite. J'ai l'impression qu'il me manque quelque chose qui permettrait de changer conditionnellement les valeurs du tableau d'origine à la place. Ne pas ajouter de nouveaux éléments, simplement modifier la valeur des éléments existants.


3 commentaires

Vous souhaitez modifier ou ajouter? Avec quoi espérez-vous finir?


@ doug-maurer, je veux ajouter à la fin de la valeur actuelle. Donc le tableau final est A 1, B 2, C 3, D 4, E 5


J'ai ajouté un exemple pour à la fois ajouter la valeur et ajouter un espace et une valeur.


3 Réponses :


0
votes

Quelque chose comme celui-ci semble être ce que vous recherchez:

$array = @('A','B', 'C', 'D', 'E')
for ($c=1; $c -le $array.count; $c++) {
    Write-host "$($array[$c-1]) $c"
}


0 commentaires

1
votes

vous avez deux options ici

​​1: définissez le résultat de foreach sur la variable que vous itérez. cela va itérer le tableau et définir le résultat sur la même variable.

$append = 'a'
for($i=0;$i -lt $array.count;$i++){
    $array[$i] = $array[$i],$append -join ' '
    $append += 'a'
}

2: définir un élément du tableau comme ceci (notez que les éléments du tableau commencent par 0 et non par 1) p >

$array[2] = 'foo'

ou dans une boucle comme celle-ci. cela définira chaque variable à l'itération.

$count = 1
$array = foreach ($item in $array) {
    "$item $count"
    $count ++
}


1 commentaires

Aha. Je pense que la chose qui me manquait était votre premier exemple, définissant le $ array = sur le résultat de la boucle. Je venais de faire la boucle et d'essayer de définir $ item = . Pour des conditions plus complexes où je ne crée pas déjà une variable d'index, cela semble mieux.



1
votes

Vous n'avez pas besoin d'ajouter @ (), c'est déjà un tableau en tant que

$array = 'A', 'B', 'C', 'D', 'E'
$array = 1..$array.Count | ForEach{"$($array[$_-1]) $_"}

Si vous voulez simplement ajouter à la chaîne et stocker de nouveau dans le tableau, voici comment je le ferait. Je profite des paramètres -Begin, -Process et -OutVariable de Foreach-Object.

$array = 'A', 'B', 'C', 'D', 'E'
$array = 1..$array.Count | ForEach{$array[$_-1] + " $_"}

Sortie (également stockée dans $ array)

A 1
B 2
C 3
D 4
E 5

Maintenant, si vous voulez réellement ajouter un espace avant le numéro, ajoutez-le simplement à l'élément comme ceci

$array | ForEach{$count = 1}{"$_ " + $count++} -OutVariable array

Sortie

A1
B2
C3
D4
E5

Si vous avez besoin de contrôler le flux de données plus explicitement, je pencherais toujours pour ne pas utiliser de boucles for. C'est équivalent.

$array | ForEach{$count = 1}{$_ + $count++} -OutVariable array

ou vous pouvez aussi l'écrire comme

$array = 'A', 'B', 'C', 'D', 'E'


1 commentaires

Bien, je ne connaissais pas le truc -outVariable. Je peux voir que cela est utile. Pour mes besoins immédiats, je pense que la première solution de Guenther ci-dessous va me permettre de gérer les conditions complexes dont mon vrai code a besoin. Mais tous les trois auront leur place dans d'autres situations.