Soru PHP'de tamsayı indeksi ile ilişkisel bir diziye erişme


Anahtar / değer çiftinin dizi dizinini kullanarak bir ilişkilendirici dizinin değerini ayarlamak istiyorum. Örneğin:

$my_arr = array( "bling" => "some bling", "bling2" => "lots O bling" );
$my_arr[1] = "not so much bling";  // Would change the value with key bling2.

Bu, anahtar dizesini kullanmadan bunu nasıl gerçekleştirebilir?


76
2018-01-22 16:52


Menşei




Cevaplar:


kullanım array_keys.

$keys = array_keys($my_arr);
$my_arr[$keys[1]] = "not so much bling";

Bu yardımcı olur umarım.


162
2018-01-22 16:54



ÇALIŞIYOR bir cazibe gibi. Teşekkürler. - Marty
Bir yan not olarak, neden PHP, bir diziye erişmenin böyle sezgisel olmayan bir yolunu yaratır? - Marty
@Marty bunun PHP'nin nasıl uygulandığıyla daha az ilgisi vardır, ancak daha çok dizilerin nasıl işlediğine dair yanlış anlamalarınız vardır. Teknik olarak, yukarıdaki hala birleşik adı kullanıyor. Sayısal ve ilişkisel dizin anahtarları arasında bir ilişki yoktur. - Gordon
İlişkisel bir dizi yaratırsınız çünkü aradığınız şey dizideki konumundan daha önemlidir. Bence bu iyi bir nokta. Öğrencilerin anahtar ve değer olarak adres adları ile bir dizi olduğunu varsayalım. Bir öğrencinin adresine ismiyle ulaşabilirsiniz. Dizinin konumu alakasız. Ve diziyi sıralayabilirsiniz name of the student. - Donovan
@Albert, bu sayıyı uygun tuş dizesine eşleştiriyorsunuz. Bu demek değil ki array[1] === $array['foo'] gerçi. Dizi hala başka bir değer içerebilir $array[1]. Çözümünüzün yanlış olduğunu söylemediğimi unutmayın. OP'nin varsayımı. - Gordon


Sayısal ve ilişkisel dizin anahtarları arasında bir ilişki yoktur.

İstediğini söylediğinde Anahtar / değer dizisini kullanarak ilişkilendirilebilir bir dizinin değerini ayarlayın.o zaman verilen anahtarı kullanmalısın $array[1] ayarla aynı değil $array['foo'].

Bu diziyi düşünün

print_r( array('foo', 'foo' => 'bar', 'baz', 'some' => 'value') );

Bu verecek

Array
(
    [0] => foo
    [foo] => bar
    [1] => baz
    [some] => value
)

Foo dizideki ikinci elementtir. İşte dengelemekAncak, dizin 1 ile ilgisi yoktur. Gördüğünüz gibi, yukarıdaki dizide, dizin 1 ile ilişkilidir baz. Çünkü bunu varsaymak yanlış foo asıl sayısal anahtar 1 ile ilgisi olan ilk ilişkilendirici anahtardır. some 2 ile korelasyon yoktur.

Benzer şekilde, yukarıda gösterildiği gibi karışık bir dizi için çözüm array_keys Bu sitenin başka bir yerinde önerilmeyecek çünkü

print_r( array_keys(array('foo', 'foo' => 'bar', 'baz', 'some' => 'value')) );

verecek

Array
(
    [0] => 0
    [1] => foo
    [2] => 1
    [3] => some
)

Ne zaman yaparsın $array[$keys[1]] gerçekten yapıyorsun $array['foo']. Ancak, bu dizideki ikinci ilişkilendirici değere erişmek isterseniz ('some'), yapamazsın $array[$keys[2]] çünkü bu değerlendirirdi $array[1] ve bu baz.

Bir elemanın Ofset'i, anahtar veya değerle tamamen ilgisizdir

print_r(
    array(
        100    => 'foo',
        'foo'  => 'bar',
        50     => 'baz',
        'some' => 'value'
    )
);

gerçekten demek

Array
( //key       value     offset/position
    [100]  => foo       // 0
    [foo]  => bar       // 1
    [50]   => baz       // 2
    [some] => value     // 3
)

Yani, ofset 0'daki eleman 100'dür ancak anahtar 100'dür. Eğer bir dizi elemanını ofset ile çıkarmak isterseniz,

$third = array_splice($array, 2, 1);
echo $third[0]; // baz

Bu sadece üçüncü konumda eleman tutan bir dizi yaratacaktır.

Ya da ArrayIterator. ArrayIterator uygular Seekable dizide belirli bir konuma / ofset aramanıza ve sonra onu getirmenize olanak tanıyan arabirim:

$iterator = new ArrayIterator($array);
$iterator->seek(3);
echo $iterator->current(); // value

24
2018-01-22 17:22





Iken array_keys() nth tuşa erişim sağlar, array_values sana nth değerini verecek.

<?php
$array = [
   0     => 'Zero',
   '1'   => 'One',
   'Two' => 'Two',
];
echo array_values($array)[2];
?>

'Two' çıkacak.

Birinin diğerinin bir avantajı var mı? Görebildiğim tek küçük dizi, dizi erişim sayısıdır.

İle array_keys() 3'e ihtiyacın var.

  1. Anahtarları veri dizisinden alın.
  2. Anahtar listesinden nth tuşunu alın.
  3. Veri dizisinden nth tuşunu kullanarak değeri alın.

İle array_values()Sadece 2'ye ihtiyacın var.

  1. Veri dizisinden değerleri alın.
  2. Değerler listesinden nth değerini alın.

Ancak, diğer taraftan, anahtarlar normalde daha küçüktür ve veriler, büyük ölçüde yuvalanmış olabilir. array_keys() muhtemelen daha güvenlidir.


14
2017-07-01 11:29





Başka bir olasılık, onu normal bir diziye dönüştürmektir:

$ arraybuff = implode ("~~~", $ my_arr);
  $ my_arr = patlayabilir ("~~~", $ dizibuff);

"~~~" ifadesi, verilerinizde meydana gelmeyen bir sınırlayıcıdır.

Artık diziye eşit olan sayısal indeksleri kullanarak diziye erişebilirsiniz.

Eğer ilişkisel dizinizi hala korumanız gerekiyorsa, onu farklı bir değişkene atamanız yeterlidir.


1
2018-01-16 20:46





Bunu dene. Senin için çalışıyor.

$result= array_values($my_arr); // Array with indexes you need

1
2017-12-23 07:24



Lütfen, çok sayıda yanıtı ve kabul edilmiş bir cevabı olan eski bir konuya gönderirken dikkatli olun. Yeni cevabınızın neden mevcut olanlardan daha iyi olduğunu açıklamalısınız. - APC
teşekkür ederim. @ APC - Murali krishna


Dizi büyükse, ikisi de array_keys ve array_values onlar sadece almak için orijinal ile aynı boyutta yeni bir dizi tahsis edeceği için israf olacak n'inci anahtar (veya değer).

array_slice bir tamsayı ofsetini kabul eder ve ilişkisel diziler üzerinde çalışır. Bunu almak (ve ayarlamak) için kullanabilirsiniz. n'inci sabit zamanda anahtar.

// 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;

1
2017-10-03 12:40