En PHP, Slice est une structure de données couramment utilisée qui nous permet de sélectionner une partie d'éléments d'un tableau ou d'une tranche. Cependant, nous devons parfois modifier la tranche et ajouter la valeur modifiée à la tranche d'origine. Cette opération est possible en PHP en modifiant la valeur dans la copie de la tranche puis en ajoutant la copie modifiée à la tranche d'origine à l'aide de la fonction array_splice. Dans cet article, nous détaillerons comment utiliser cette méthode pour implémenter des opérations de modification de tranche et d'ajout.
Écrivez une fonction qui copie une tranche et modifie les valeurs des éléments dans la copie de la tranche, puis ajoute la copie à la copie originale. Il semble que le code modifie non seulement la copie de la tranche, mais également la tranche d'origine.
Aller au terrain de jeux
import "fmt" type item struct { name string number int } func main() { names := []string{"a", "b"} numbers := []int{1, 2} items := []*item{} for _, name := range names { item := &item{name: name} items = append(items, item) } for n, i := range numbers { if n > 0 { fmt.println(n, "make a copy of the items") itemcopies := make([]*item, len(items)) copy(itemcopies, items) fmt.println(n, "set the numbers on the copies") for _, item := range itemcopies { item.number = i } fmt.println(n, "append the copies to the original") items = append(items, itemcopies...) } else { fmt.println(n, "first pass set all the items to the first number") for _, item := range items { item.number = i } } } for n, i := range items { fmt.printf("%d %+v\n", n, *i) } }
Ce que j'ai réellement vu
0 {name:a number:2} 1 {name:b number:2} 2 {name:a number:2} 3 {name:b number:2}
Qu'est-ce que je m'attends à voir
0 {name:a number:1} 1 {name:b number:1} 2 {name:a number:2} 3 {name:b number:2}
@jimb a raison, vous copiez le pointeur,
Je suggère de définir une fonction de copie appartenant à struct item pour créer une nouvelle copie
package main import "fmt" type Item struct { name string number int } func (it *Item) copy() *Item { return &Item{ name: it.name, number: it.number, } } func main() { names := []string{"a", "b"} numbers := []int{1, 2} items := []*Item{} for _, name := range names { item := &Item{name: name} items = append(items, item) } for n, i := range numbers { if n > 0 { fmt.Println(n, "make a copy of the items") itemCopies := make([]*Item, len(items)) for j := 0; j < len(items); j++ { itemCopies[j] = items[j].copy() } fmt.Println(n, "set the numbers on the copies") for _, item := range itemCopies { item.number = i } fmt.Println(n, "append the copies to the original") items = append(items, itemCopies...) } else { fmt.Println(n, "first pass set all the items to the first number") for _, item := range items { item.number = i } } } for n, i := range items { fmt.Printf("%d %+v\n", n, *i) } }
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!