Saya ingin menetapkan nilai array asosiatif menggunakan indeks array pasangan kunci / nilai. Sebagai contoh:
$my_arr = array( "bling" => "some bling", "bling2" => "lots O bling" );
$my_arr[1] = "not so much bling"; // Would change the value with key bling2.
Bagaimana ini bisa mencapai ini tanpa menggunakan string kunci?
name of the student
.without using a key string
.array[1] === $array['foo']
. Larik masih bisa berisi nilai lain di$array[1]
. Perhatikan bahwa saya tidak mengatakan solusi Anda salah. Itu asumsi OP.Tidak ada korelasi antara kunci indeks numerik dan asosiatif.
Ketika Anda mengatakan Anda ingin mengatur nilai array asosiatif menggunakan indeks array dari kunci / nilai , maka Anda harus menggunakan kunci yang diberikan, pengaturan
$array[1]
tidak sama dengan pengaturan$array['foo']
.Pertimbangkan larik ini
print_r( array('foo', 'foo' => 'bar', 'baz', 'some' => 'value') );
Ini akan memberi
Array ( [0] => foo [foo] => bar [1] => baz [some] => value )
Foo adalah elemen kedua dalam larik. Itu offsetnya , tapi tidak ada hubungannya dengan indeks 1. Seperti yang Anda lihat, dalam larik di atas, indeks 1 dikaitkan dengan
baz
. Salah untuk mengasumsikan bahwa hanya karenafoo
kunci asosiatif pertama itu ada hubungannya dengan kunci numerik 1. Sama sepertisome
tidak berkorelasi dengan 2.Demikian juga, untuk array campuran seperti yang ditunjukkan di atas, solusi dengan yang
array_keys
disarankan di tempat lain di situs ini tidak akan berfungsi, karenaprint_r( array_keys(array('foo', 'foo' => 'bar', 'baz', 'some' => 'value')) );
akan memberi
Array ( [0] => 0 [1] => foo [2] => 1 [3] => some )
Jadi, ketika Anda melakukannya,
$array[$keys[1]]
Anda benar-benar melakukannya$array['foo']
. Tetapi jika Anda ingin mengakses nilai asosiatif kedua dalam array itu ('some'
), Anda tidak dapat melakukannya$array[$keys[2]]
karena itu akan mengevaluasi ke$array[1]
dan itubaz
.Offset elemen sama sekali tidak terkait dengan kunci atau nilainya
print_r( array( 100 => 'foo', 'foo' => 'bar', 50 => 'baz', 'some' => 'value' ) );
benar-benar berarti
Array ( //key value offset/position [100] => foo // 0 [foo] => bar // 1 [50] => baz // 2 [some] => value // 3 )
yang berarti elemen pada offset 0 adalah foo meskipun kuncinya adalah 100. Jika Anda ingin mengekstrak elemen dari larik dengan offset, Anda harus menggunakan
$third = array_splice($array, 2, 1); echo $third[0]; // baz
Ini akan membuat sebuah array yang hanya menampung elemen di posisi ketiga.
Atau Anda bisa menggunakan
ArrayIterator
. TheArrayIterator
mengimplementasikan sebuahSeekable
antarmuka yang memungkinkan Anda mencari untuk posisi tertentu / offset dalam array dan kemudian mengambil bahwa:$iterator = new ArrayIterator($array); $iterator->seek(3); echo $iterator->current(); // value
sumber
array_keys
. Tidak ada entitas seperti "kunci non-asosiatif". Jika Anda bermaksud untuk menunjukkan bahwa Anda tidak dapat mengembalikan kunci string ke-2 (dengan mengasumsikan array kunci hanya berisi string), maka yang Anda katakan adalah benar.$stringKeys = array_filter(array_keys($array), "is_string");
memberikan kunci string.Sementara
array_keys()
memungkinkan akses ke kunci ke-n,array_values
akan memberi Anda nilai ke-n.<?php $array = [ 0 => 'Zero', '1' => 'One', 'Two' => 'Two', ]; echo array_values($array)[2]; ?>
akan menampilkan 'Dua'.
Apakah ada keuntungan yang satu dibandingkan yang lain? Nah, satu-satunya yang kecil yang bisa saya lihat adalah jumlah akses array.
Dengan
array_keys()
Anda perlu 3.Dengan
array_values()
, Anda hanya perlu 2.Tapi, di sisi lain, kunci biasanya lebih kecil dan datanya bisa sangat bertumpuk, jadi, jika seimbang, menggunakan
array_keys()
mungkin lebih aman.sumber
Jika arraynya besar, keduanya
array_keys
danarray_values
akan sia-sia karena mereka akan mengalokasikan array baru dengan ukuran yang sama dengan aslinya, hanya untuk mendapatkan kunci ke - n (atau nilai).array_slice
menerima offset integer dan bekerja pada array asosiatif. Anda dapat menggunakannya untuk mendapatkan (dan menyetel) kunci ke - n dalam waktu yang konstan.// This will at most allocate 2 temporary arrays of 1 element each $key = array_keys(array_slice($array, $n, 1, true))[0]; $array[$key] = $value;
sumber
Coba ini. Ini bekerja untuk Anda.
$result= array_values($my_arr); // Array with indexes you need
sumber
Kemungkinan lain adalah mengubahnya menjadi array normal:
Di mana "~~~" adalah pemisah yang tidak akan terjadi dalam data Anda.
Sekarang Anda dapat mengakses array menggunakan indeks numerik yang sama dengan offset.
Jika Anda masih perlu mempertahankan array asosiatif Anda, tetapkan saja ke variabel yang berbeda.
sumber