PHP İlişkilendirilebilir diziden öğeleri kaldırır


100

Şuna benzeyen bir PHP dizim var:

Index              Key     Value
[0]                1       Awaiting for Confirmation
[1]                2       Assigned
[2]                3       In Progress
[3]                4       Completed
[4]                5       Mark As Spam

Dizi değerlerini var_dump yaptığımda şunu elde ederim:

array(5) { [0]=> array(2) { ["key"]=> string(1) "1" ["value"]=> string(25) "Awaiting for Confirmation" } [1]=> array(2) { ["key"]=> string(1) "2" ["value"]=> string(9) "Assigned" } [2]=> array(2) { ["key"]=> string(1) "3" ["value"]=> string(11) "In Progress" } [3]=> array(2) { ["key"]=> string(1) "4" ["value"]=> string(9) "Completed" } [4]=> array(2) { ["key"]=> string(1) "5" ["value"]=> string(12) "Mark As Spam" } }

Tamamlandı ve Spam Olarak İşaretle'yi kaldırmak istedim . Yapabileceğimi biliyorum unset[$array[3],$array[4])ama sorun şu ki bazen dizin numarası farklı olabilir.

Anahtar değeri yerine değer adını eşleştirerek bunları kaldırmanın bir yolu var mı?


Buradaki soruyu anlayıp anlamadığımdan emin değil misiniz? Bazen indeks numarasının farklı olabileceği ne demek?
Simon H

Yanıtlar:


153

Diziniz oldukça garip: neden sadece keyas dizinini ve valueas ... değerini kullanmıyorsunuz ?

Diziniz şu şekilde bildirilseydi çok daha kolay olmaz mıydı:

$array = array(
    1 => 'Awaiting for Confirmation', 
    2 => 'Asssigned', 
    3 => 'In Progress', 
    4 => 'Completed', 
    5 => 'Mark As Spam', 
);

Bu key, diziye erişmek için değerlerinizi indeksler olarak kullanmanıza izin verir ...

Ve değerler üzerinde arama yapmak için işlevler kullanabilirsiniz, örneğin array_search():

$indexCompleted = array_search('Completed', $array);
unset($array[$indexCompleted]);

$indexSpam = array_search('Mark As Spam', $array);
unset($array[$indexSpam]);

var_dump($array);

Dizinizden daha kolay, değil mi?



Bunun yerine, aşağıdaki gibi görünen dizinizle:

$array = array(
    array('key' => 1, 'value' => 'Awaiting for Confirmation'), 
    array('key' => 2, 'value' => 'Asssigned'), 
    array('key' => 3, 'value' => 'In Progress'), 
    array('key' => 4, 'value' => 'Completed'), 
    array('key' => 5, 'value' => 'Mark As Spam'), 
);

Doğru öğeleri analiz etmek valueve ayarını kaldırmak için tüm öğelerin üzerinden geçmeniz gerekir :

foreach ($array as $index => $data) {
    if ($data['value'] == 'Completed' || $data['value'] == 'Mark As Spam') {
        unset($array[$index]);
    }
}
var_dump($array);

Yapılabilir olsa bile, bu o kadar basit değil ... ve ısrar ediyorum: dizinizin formatını daha basit bir anahtar / değer sistemiyle çalışmak için değiştiremez misiniz?


"Değeri analiz etmek için tüm öğelerin üzerinden geçmeniz gerekecek". Array_search kullandığınızda, tüm öğeler arasında da arama yapabilirsiniz.
Nicolas Aoki

96
  ...

  $array = array(
      1 => 'Awaiting for Confirmation', 
      2 => 'Asssigned', 
      3 => 'In Progress', 
      4 => 'Completed', 
      5 => 'Mark As Spam', 
  );



  return array_values($array);
  ...

3
Teşekkürler, sadece bunu arıyordum! :)
Ravi Dhoriya ツ

2
güzel ve kolay . sadece bunu arıyorum
Faisal Mehmood Awan

Doğru cevap bu, kontrol edilmedi.
A.Seddighi

16
$key = array_search("Mark As Spam", $array);
unset($array[$key]);

2D diziler için ...

$remove = array("Mark As Spam", "Completed");
foreach($arrays as $array){
    foreach($array as $key => $value){
        if(in_array($value, $remove)) unset($array[$key]);
    }
}


3

Array_diff neden kullanılmıyor?

$array = array(
    1 => 'Awaiting for Confirmation', 
    2 => 'Asssigned', 
    3 => 'In Progress', 
    4 => 'Completed', 
    5 => 'Mark As Spam', 
);
$to_delete = array('Completed', 'Mark As Spam');
$array = array_diff($array, $to_delete);

Dizinizin yeniden dizine ekleneceğini unutmayın.


1

Bunu dene:

$keys = array_keys($array, "Completed");

/ edit JohnP tarafından belirtildiği gibi, bu yöntem yalnızca iç içe olmayan diziler için çalışır.


0

İç içe geçmiş hedef dizinizi almak ve onu tek adımda iç içe olmayan bir diziye kopyalamak için bunu yapmanın yolu. Anahtarları silin ve son kesilmiş diziyi önceki dizinin iç içe düğümüne atayın. İşte bunu basitleştirmek için bir kod:

$temp_array = $list['resultset'][0];

unset($temp_array['badkey1']);
unset($temp_array['badkey2']);

$list['resultset'][0] = $temp_array;

0

Kabul edilen cevaba katılmıyorum. Bazen bir uygulama mimarisi dizi kimliğiyle uğraşmanızı istemez veya onu uygunsuz hale getirir. Örneğin, CakePHP'yi oldukça kullanıyorum ve bir veritabanı sorgusu, yukarıdakine çok benzer şekilde her kayıtta birincil anahtarı bir değer olarak döndürüyor.

Dizinin aptalca büyük olmadığını varsayarsak, array_filter kullanırdım. Bu, dizinin bir kopyasını, kaldırmak istediğiniz kayıtların çıkarılmasını sağlar ve orijinal dizi değişkenine geri atayabilirsiniz.

Bu verimsiz görünse de, bu günlerde değişkenlerin değişmez olması çok revaçta ve çoğu php dizisi işlevinin orijinalle uğraşmak yerine yeni bir dizi döndürmesi gerçeği, PHP'nin bunu da yapmanızı istediği anlamına geliyor. Ve dizilerle ne kadar çok çalışırsanız ve unset () fonksiyonunun ne kadar zor ve sinir bozucu olduğunu anladıkça, bu yaklaşım çok mantıklıdır.

Her neyse:

$my_array = array_filter($my_array, 
                         function($el) { 
                            return $el["value"]!="Completed" && $el!["value"]!="Marked as Spam"; 
                         });

İstediğiniz gömülü işlevde dahil etme mantığını (örn. Kimlik alanınız) kullanabilirsiniz.


-1

tek dizi için Öğe kullanımı reset($item)


Sıfırlama işlevi, bir diziden öğeleri kaldırmak veya öğeleri kaldırmak için değil, dahili dizi işaretçisini taşımak için kullanılmalıdır. Bunun yerine ayarlanmamış kullanın. Çözümünüz işe yararsa, istenmeyen yan etkileri de vardır.
David
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.