PHP'de bir diziden eleman silme

PHP kullanarak bir diziden eleman silmenin kolay bir yolu var mıdır, öyle ki foreach ($dizi) artık o elemanı içermesin?

Bunu null olarak ayarlamanın işe yarayacağını düşünmüştüm, ancak görünüşe göre işe yaramıyor.

Çözüm

Bir dizi elemanını silmenin farklı yolları vardır ve bazıları bazı özel görevler için diğerlerinden daha kullanışlıdır.

Bir dizi elemanını sil

Eğer sadece bir dizi elemanını silmek istiyorsanız \unset() veya alternatif olarak \array_splice() kullanabilirsiniz.

Ayrıca, değere sahipseniz ve öğeyi silmek için anahtarı bilmiyorsanız, anahtarı almak için \array_search() kullanabilirsiniz.

\unset() yöntemi

unset()kullandığınızda dizi anahtarlarının değişmeyeceğini/yeniden indekslenmeyeceğini unutmayın. Anahtarları yeniden indekslemek isterseniz,\unset()işlevinden sonra [\array_values()`]5 kullanabilirsiniz; bu, tüm anahtarları 0'dan başlayarak sayısal numaralandırılmış anahtarlara dönüştürecektir.

Kod

<?php

    $array = [0 => "a", 1 => "b", 2 => "c"];
    \unset($array[1]);
                //↑ Key which you want to delete

?>

Çıktı

[
    [0] => a
    [2] => c
]

\array_splice() yöntemi

Eğer \array_splice() kullanırsanız, anahtarlar otomatik olarak yeniden indekslenir, ancak tüm anahtarları sayısal anahtarlara dönüştürecek olan \array_values() işlevinin aksine ilişkisel anahtarlar değişmez.

Ayrıca \array_splice() ikinci parametre olarak anahtara değil ofsete ihtiyaç duyar!

Kod

<?php

    $array = [0 => "a", 1 => "b", 2 => "c"];
    \array_splice($array, 1, 1);
                        //↑ Offset which you want to delete

?>

Çıktı

[
    [0] => a
    [1] => c
]

array_splice(),\unset()` gibi diziyi referans olarak alır ve bu, bu işlevlerin dönüş değerlerini diziye geri atamak istemediğiniz anlamına gelir.

Birden fazla dizi elemanını silme

Birden fazla dizi elemanını silmek istiyorsanız ve \unset() veya \array_splice() işlevlerini birden fazla kez çağırmak istemiyorsanız, silmek istediğiniz elemanların değerlerini veya anahtarlarını bilip bilmediğinize bağlı olarak \array_diff() veya \array_diff_key() işlevlerini kullanabilirsiniz.

\array_diff() yöntemi

Silmek istediğiniz dizi elemanlarının değerlerini biliyorsanız, \array_diff() işlevini kullanabilirsiniz. Daha önce \unset() ile olduğu gibi, dizinin anahtarlarını değiştirmez/yeniden indekslemez.

Kod

<?php

    $array = [0 => "a", 1 => "b", 2 => "c"];
    $array = \array_diff($array, ["a", "c"]);
                               //└────────┘→ Array values which you want to delete

?>

Çıktı

[
    [1] => b
]

\array_diff_key() yöntemi

Silmek istediğiniz öğelerin anahtarlarını biliyorsanız, \array_diff_key() işlevini kullanmak istersiniz. Burada, anahtarları değer olarak değil, ikinci parametrede anahtar olarak geçirdiğinizden emin olmalısınız. Aksi takdirde, diziyi \array_flip() ile çevirmeniz gerekir. Ve ayrıca burada anahtarlar değişmez/yeniden indekslenmez.

Kod

<?php

    $array = [0 => "a", 1 => "b", 2 => "c"];
    $array = \array_diff_key($array, [0 => "xy", "2" => "xy"]);
                                    //↑           ↑ Array keys which you want to delete
?>

Çıktı

[
    [1] => b
]

Ayrıca, aynı değere sahip birden fazla öğeyi silmek için \unset() veya \array_splice() kullanmak istiyorsanız, belirli bir değer için tüm anahtarları almak ve ardından tüm öğeleri silmek için \array_keys() kullanabilirsiniz.

Yorumlar (9)

unset()`]1'in indekslere dokunmayacağı unutulmamalıdır; bu, dize indekslerini (hashtable olarak dizi) kullanırken beklediğiniz şeydir, ancak tamsayı indeksli dizilerle uğraşırken oldukça şaşırtıcı olabilir:

$array = array(0, 1, 2, 3);
unset($array[2]);
var_dump($array);
/* array(3) {
  [0]=>
  int(0)
  [1]=>
  int(1)
  [3]=>
  int(3)
} */

$array = array(0, 1, 2, 3);
array_splice($array, 2, 1);
var_dump($array);
/* array(3) {
  [0]=>
  int(0)
  [1]=>
  int(1)
  [2]=>
  int(3)
} */

Dolayısıyla, tamsayı anahtarlarınızı normalleştirmek istiyorsanız array_splice() kullanılabilir. Başka bir seçenek de unset()'den sonra array_values() kullanmaktır:

$array = array(0, 1, 2, 3);

unset($array[2]);
$array = array_values($array);
var_dump($array);
/* array(3) {
  [0]=>
  int(0)
  [1]=>
  int(1)
  [2]=>
  int(3)
} */
Yorumlar (8)
unset($array[$index]);
Yorumlar (0)