Dizi Elemanını Çıkarma ve Sonra Diziyi Yeniden İndeksleme Nasıl Yapılır?


206

Bir dizi ile ilgili bazı sorunlar var. Aşağıdaki gibi değiştirmek istediğiniz bir dizi var. Öğe (elemanları) dizin tarafından kaldırmak ve sonra dizi yeniden dizin istiyorum. Mümkün mü?

$foo = array(

    'whatever', // [0]
    'foo', // [1]
    'bar' // [2]

);

$foo2 = array(

    'foo', // [0], before [1]
    'bar' // [1], before [2]

);

Yanıtlar:


456
unset($foo[0]); // remove item at index 0
$foo2 = array_values($foo); // 'reindex' array

6
Göndermek istediğim tam olarak bu, +1.
Michiel Pater

4
Bu, birkaç öğenin bir kerede kaldırılması gerekirse deceze'in çözümünden daha iyidir - bu öğelerin dizinleri önceden toplanırsa. İlk öğede array_splice kullandığınızda, geri kalan öğelerin dizinlerini kaybedersiniz.
Jānis Elmeris

23
Tek bir unset($foo[0], $foo[3], $bar[1]);
ayarsız çağrıda

çok güzel bir çözüm kardeşim :)
Michael Kisilenko

Bunu kullandım. Teşekkür ederim. Ben kullanıyordum array_spliceve 0-th ve 1 indeksleri için çalışma yoktu.
theGreenCabbage


29

Kullansan iyi edersin array_shift(). Bu, dizinin ilk öğesini döndürür, diziden kaldırır ve diziyi yeniden dizine ekler. Hepsi tek bir verimli yöntemde.


2
İlk dizi öğesini almak ve kaldırmak istediğinizde diziyi yeniden dizine eklemek istediğinizde bu iyi olur. Karşı array_pop()bölümü işlevi , gerekirse son dizi öğesini alır ve kaldırır. Ancak, dizinin ortasındaki bir öğe üzerinde hareket etmek için her iki işlev de yapılamaz.
Derrick Miller

1
Bu dikey olarak ilişkili olsa da, soru sadece birincinin değil, bir dizinin herhangi bir öğesiyle ilgili .
Félix Gagnon-Grenier


9
Unset($array[0]); 

Sort($array); 

Bunun neden reddedildiğini bilmiyorum, ama eğer birisi denemek için uğraştıysa, işe yaradığını fark edeceksiniz. Bir dizide sort kullanıldığında dizinin anahtarları yeniden atanır. Tek dezavantajı, değerleri sıralamasıdır. Anahtarlar açık bir şekilde yeniden atanacağından, olsa bile array_values, değerlerin sıralanıp sıralanmadığı önemli değildir.


9
anahtarlar yeniden atanmış olsa bile, doğru cevapta ilk sıra korunacaktır.
s3v3n

1
Msgstr "Onun elemanını (elemanlarını) indekse göre kaldırmak ve dizini tekrar endekslemek istiyorum. Mümkün mü?" @ s3v3n OP hiçbir zaman ilk siparişi korumayı istemedi. Ben sadece çalışan ve belirtilenleri yapan bir çözüm sağladım.
ayaz

1
Soru 2 yaşında. Bırak gitsin!
s3v3n

@ s3v3n Kin değil. Sadece nedenini bilmek istiyorum. Açıkçası daha sonraki cevaplarda geliştirmek. Daha iyi yöntemler olduğunu kabul ediyorum, ancak bu cevabın bu kadar kötü olmasının bir nedeni var mı? Performans mı? vb? Aynı sebepten ötürü, öğretmenin yanı sıra öğrenmek için de SO'dayım.
ayaz

Normal şartlar altında, programcının bu değerlere girdiyle tam olarak aynı sırayla ihtiyacı olacaktır. Örnek olarak, bir tabloda görüntülenmesi gereken veritabanındaki bazı satırları alalım; veya yanıtların tam olarak aynı sırada olması gereken bir sohbet uygulaması. Örnek sayısı sonsuz olabilir, önemli olan, çoğu durumda siparişin aynı olması veya en azından programcının dizideki elemanların aynı sırasını beklemesidir.
s3v3n

4

Şunu deneyin:

$foo2 = array_slice($foo, 1);

Bu sadece ilk eleman için geçerlidir, keyfi bir eleman için değildir.
Felix Kling

0

Xzyfer'in cevabına ek olarak

İşlev

function custom_unset(&$array=array(), $key=0) {
    if(isset($array[$key])){

        // remove item at index
        unset($array[$key]);

        // 'reindex' array
        $array = array_values($array);

        //alternatively
        //$array = array_merge($array); 

    }
    return $array;
}

kullanım

$my_array=array(
    0=>'test0', 
    1=>'test1', 
    2=>'test2'
);

custom_unset($my_array, 1);

Sonuç

 array(2) {
    [0]=>
    string(5) "test0"
    [1]=>
    string(5) "test2"
  }

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.