Soru PHP: Bir diziden bir elemanı sil


Kullanarak bir dizi bir öğeyi silmek için kolay bir yolu var mı PHP, öyle ki foreach ($array) artık bu öğeyi içermiyor?

Bunu ayarladığımı düşündüm. null yapardı, ama görünüşe göre işe yaramıyor.


1972
2017-12-15 20:28


Menşei


Konrad cevabının, belirtilen problemin en basit olanı olduğunu söylemem. İle unset() dizinin üzerindeki yinelemeler artık kaldırılan değeri içermeyecektir. OTOH, Stevan'ın cevabının bol olduğu ve aslında aradığım cevap olduğu doğrudur - ama OP değil :) - brandizzi
@danip Kılavuzda bulunması kolay StackOverflow ile ilgili bir soruyu engellemez. Eğer soru bir çift StackOverflow sorusu, o zaman buraya ait olmayabilir. StackOverflow, kılavuza bakmadan bile, yanıtları bir seçenek olarak bulmak için iyi bir yerdir. - Dan Nissenbaum
@unset ($ dizi [$ anahtar]); $ array = array_values ​​($ dizi); - trojan
Bunu bir foreach döngüsünde kaldırmakla ilgili soru: stackoverflow.com/questions/1949259/... - Legolas
Dizi dizisinden (İlişkilendirilmiş dizi) anahtarları kaldırmak isterseniz, bkz. stackoverflow.com/a/47978980/1045444 - Somnath Muluk


Cevaplar:


Bazı belirli görevler için bazılarının diğerlerinden daha yararlı olduğu bir dizi öğesini silmek için farklı yollar vardır.

Bir dizi elemanını sil

Eğer sadece bir dizi öğesini silmek istiyorsanız kullanabilirsiniz unset() ya da alternatif array_splice().

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

unset() yöntem

Kullandığınızda unutmayın unset() dizi anahtarları değişmeyecek / reindex. Anahtarları yeniden dizine eklemek isterseniz array_values() sonra unset() tüm anahtarları 0'dan başlayan sayısal numaralandırılmış tuşlara dönüştürecektir.

kod

<?php

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

?>

Çıktı

Array (
    [0] => a
    [2] => c
)

array_splice() yöntem

Eğer kullanırsan array_splice() tuşlar otomatik olarak yeniden endekslenecektir, ancak ilişkilendirici anahtarlar karşıt olarak değişmeyecektir. array_values() tüm anahtarları sayısal tuşlara dönüştürecek.

Ayrıca array_splice() Ofset gerek, anahtar değil! ikinci parametre olarak.

kod

<?php

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

?>

Çıktı

Array (
    [0] => a
    [1] => c
)

array_splice() ile aynı unset() diziyi referans alarak alın, bu, bu işlevlerin dönüş değerlerini diziye geri atamak istemediğiniz anlamına gelir.

Birden çok dizi öğesini silin

Birden çok dizi öğesini silmek ve aramak istemiyorsanız unset() veya array_splice() Birden çok kez işlevleri kullanabilirsiniz array_diff() veya array_diff_key() Silmek istediğiniz elemanların değerlerini veya anahtarlarını biliyorsanız.

array_diff() yöntem

Silmek istediğiniz dizi elemanlarının değerlerini biliyorsanız, o zaman kullanabilirsiniz array_diff(). İle önceki gibi unset() dizinin anahtarlarını değiştirmeyecek / yeniden dizine eklemeyecektir.

kod

<?php

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

?>

Çıktı

Array (
    [1] => b
)

array_diff_key() yöntem

Silmek istediğiniz elemanların anahtarlarını biliyorsanız, o zaman kullanmak istersiniz. array_diff_key(). Burada, anahtarları ikinci parametre olarak anahtar olarak geçirdiğinizden emin olmalısınız. Aksi halde, diziyi array_flip(). Ve ayrıca burada anahtarlar değişmeyecek / reindex.

kod

<?php

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

Çıktı

Array (
    [1] => b
)

Ayrıca kullanmak isterseniz unset() veya array_splice() Birden fazla öğeyi aynı değerle silmek için kullanabilirsiniz array_keys() belirli bir değer için tüm anahtarları almak ve sonra tüm öğeleri silmek.


2229
2017-12-15 21:25



<? php $ x = array (1, 2, 3, 4) varsa; sertleşmemiş ($ x [2]); var_dump ($ x); // dizi (3) {[0] => int (0), [1] => int (2), [3] => int (4),}?> - Alexandru Rada
@AlexandruRada Hayır, “bunu kullanma” dedin - ve bu sadece saçmalık. Bir diziyi olduğu gibi ele aldığınızda bu yöntemi güvenle kullanabilirsiniz - sözlük. Yalnızca ardışık sayısal indeksler bekliyorsanız başka bir şey kullanmanız gerekir. - Konrad Rudolph
@Alexander Kullanımı array_spliceDiğer cevaplarda açıklandığı gibi. - Konrad Rudolph
@AlexandruRada sahip olmanın yolu yok array (3) { [0]=>int(0) ... sen ne zaman unset($x[2]) itibaren $x = array(1, 2, 3, 4); Sonuç şart olmak var_dump($x); // array(3) { [0]=> int(1) [1]=> int(2) [3]=> int(4) } (muhtemelen yazım hatası) - inemanja
array_filter da uygulanabilir bir yöntemdir. Özellikle diziyi değiştirmek istemiyorsanız, ancak aynı zamanda json_encode ile ilgili bir sorun olabilen yeniden dizine de sahip olmazsınız. php.net/manual/en/function.json-encode.php#94157 - dotnetCarpenter


bu not alınmalı unset() Dize indekslerini (hashtable dizisi) kullanırken beklediğiniz dizeleri el değmemiş tutacak, ancak tamsayı dizinli 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)
} */

Yani array_splice() tamsayı anahtarlarınızı normalleştirmek istiyorsanız kullanılabilir. Başka bir seçenek kullanıyor array_values() sonra unset():

$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)
} */

1302
2017-08-02 15:57



Array_splice () kullandığınızda, OFFSET'i bilmeniz gerektiğini unutmayın, anahtarı değil, kaldırmak istediğiniz öğenin ofsetini (!) - Tom
@ Tom: Düzenli bir dizi için (bu sürekli bir tamsayı indeksli) ofset dizindir. Bu nerede array_splice (diğerleri arasında) mantıklı olabilir. - Stefan Gehrig
Tabii ki, ancak splice kullanmadan önce diziyle kurcalamayacağınızı hatırlamanız gereken bir şey var. - Tom
Devasa bir diziden gelen bir ton elemanın silinmesiyle ilgili basit bir testten, array_splice çok daha hızlı ve daha az bellek yoğun görünüyor. Bu beklediklerimle eşleşiyor: array_values ​​() dizinin bir kopyasını oluştururken, array_splice yerinde çalışıyor. - Doug Kavendek
array_values ​​öğelerin bir döngü içinde kaldırılması ve dizinlerin tutarlı olmasını istediğinizde ancak döngüden sonra bunları sıkıştırmak istediğinizde yararlı bir yaklaşımdır. - Rorrik


  // our initial array  
   $arr = array("blue", "green", "red", "yellow", "green", "orange", "yellow", "indigo", "red");  
  print_r($arr);

  // remove the elements who's values are yellow or red  
   $arr = array_diff($arr, array("yellow", "red"));
  print_r($arr);  

Yukarıdaki koddan çıktı:

Array
(
    [0] => blue
    [1] => green
    [2] => red
    [3] => yellow
    [4] => green
    [5] => orange
    [6] => yellow
    [7] => indigo
    [8] => red
)

Array
(
    [0] => blue
    [1] => green
    [4] => green
    [5] => orange
    [7] => indigo
)

Şimdi, array_values ​​(), sayısal bir diziyi güzel bir şekilde yeniden indeksleyecektir, ancak diziden tüm anahtar dizelerini kaldıracak ve bunları sayılarla değiştirecektir. Anahtar adlarını (dizeleri) korumanız gerekirse veya tüm anahtarlar sayısalsa diziyi yeniden dizine eklemeniz gerekirse, array_merge () öğesini kullanın:

$arr = array_merge(array_diff($arr, array("yellow", "red")));
print_r($arr);

çıktılar

Array
(
    [0] => blue
    [1] => green
    [2] => green
    [3] => orange
    [4] => indigo
)

321
2017-11-15 11:29





$key = array_search($needle,$array);
if($key!==false){
    unset($array[$key]);
}

176
2017-12-15 20:31



Bu cevabın, bir değeri sildiğinizde, değeri bildiğinizde değil, anahtarı sildiğini açıklığa kavuşturmak iyi olur. Sadece değerin FIRST örneğini siler; bulmak herşey bir değer için anahtarlar, kullanın array_keys - ToolmakerSteve


unset($array[$index]);

58
2017-11-26 08:25





Sayısal olarak indekslenmiş bir diziniz varsa, tüm değerlerin benzersiz olduğu (veya benzersiz olmadığı, ancak belirli bir değerin tüm örneklerini kaldırmak istediğiniz) varsa, bunun gibi eşleşen bir öğeyi kaldırmak için array_diff () yöntemini kullanabilirsiniz:

$my_array = array_diff($my_array, array('Value_to_remove'));

Örneğin:

$my_array = array('Andy', 'Bertha', 'Charles', 'Diana');
echo sizeof($my_array) . "\n";
$my_array = array_diff($my_array, array('Charles'));
echo sizeof($my_array);

Bu, aşağıdakileri görüntüler:

4
3

Bu örnekte, 'Charles' değerine sahip öğe, başlangıç ​​dizisi için 4 ve rapor kaldırıldıktan sonra 3 boyutlarını bildiren sizeof () çağrıları tarafından doğrulanabileceği gibi kaldırılmıştır.


55
2017-07-31 01:06





Ayrıca, adlandırılmış bir öğe için:

unset($array["elementName"]);


48
2017-07-19 15:37



$a = array("A"=>1, "B"=>2, "C"=>"a");  print_r($a);  unset($a["B"]);  print_r($a);  verir (biçimlendirilmiş): Array ( [A] => 1 [B] => 2 [C] => a ), Array ( [A] => 1 [C] => a ) - DefenestrationDay
Bir dizeyle indekslenmiş dizi elemanlarını çıkaramazsınız ("Ölümcül hata: String ofsetlerini kaldıramıyor"). Ben her zaman böyle olduğunu düşünmüyorum, ama kesinlikle PHP 5.3.10 ve muhtemelen daha önce olduğu gibi - carpii
@carpii PHP, ilişkilendirici bir diziden öğeleri kaldırabilir. Ölümcül hata, dizinin yerine bir dizede unset ($ var ['key']) kullanmaya çalıştığınızda oluşur. Örneğin: $ array = array ('test' => 'value', 'another' => ' değer ',); sertleşmemiş ($ dizi [ 'test']); // "test" öğesini diziden beklenen $ array = 'test' olarak kaldırır; sertleşmemiş ($ dizi [ 'test']); // Atar "Önemli hata: Dize ofsetlerini kaldıramıyor" beklendiği gibi - Jimbo