Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Ubah suai nilai dalam salinan kepingan dan tambahkan pada kepingan asal

Ubah suai nilai dalam salinan kepingan dan tambahkan pada kepingan asal

PHPz
PHPzke hadapan
2024-02-09 16:36:07422semak imbas

Ubah suai nilai dalam salinan kepingan dan tambahkan pada kepingan asal

Dalam PHP, Slice ialah struktur data yang biasa digunakan yang membolehkan kami memilih sebahagian daripada elemen daripada tatasusunan atau kepingan. Walau bagaimanapun, kadangkala kita perlu mengubah suai kepingan dan menambah nilai yang diubah suai pada kepingan asal. Operasi ini boleh dilakukan dalam PHP dengan mengubah suai nilai dalam salinan kepingan dan kemudian menambahkan salinan yang diubah suai pada kepingan asal menggunakan fungsi array_splice. Dalam artikel ini, kami akan memperincikan cara menggunakan kaedah ini untuk melaksanakan pengubahsuaian kepingan dan operasi tambah.

Kandungan soalan

Tulis fungsi yang menyalin kepingan dan mengubah suai nilai item dalam salinan kepingan, kemudian tambahkan salinan itu pada salinan asal. Nampaknya kod itu bukan sahaja mengubah suai salinan kepingan, tetapi juga kepingan asal.

Pergi ke taman permainan

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)
    }
}

Apa yang saya nampak sebenarnya

0 {name:a number:2}
1 {name:b number:2}
2 {name:a number:2}
3 {name:b number:2}

Apa yang saya harapkan dapat dilihat

0 {name:a number:1}
1 {name:b number:1}
2 {name:a number:2}
3 {name:b number:2}

Penyelesaian

@jimb betul, awak salin penunjuk,

Saya cadangkan mentakrifkan fungsi salin kepunyaan item struct untuk mencipta salinan baharu

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)
    }
}

Atas ialah kandungan terperinci Ubah suai nilai dalam salinan kepingan dan tambahkan pada kepingan asal. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:stackoverflow.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam