PHP Hapus elemen dari array asosiatif

100

Saya memiliki array PHP yang terlihat seperti ini:

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

Ketika saya var_dump nilai array saya mendapatkan ini:

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" } }

Saya ingin menghapus Selesai dan Tandai Sebagai Spam . Saya tahu saya bisa unset[$array[3],$array[4]), tetapi masalahnya adalah terkadang nomor indeks bisa berbeda.

Apakah ada cara untuk menghapusnya dengan mencocokkan nama nilai alih-alih nilai kunci?

pengguna648198
sumber
tidak yakin apakah saya memahami pertanyaan yang ada di sini? Apa maksud Anda terkadang nomor indeks bisa berbeda?
Simon H

Jawaban:

153

Array Anda cukup aneh: mengapa tidak menggunakan keyas index, dan valueas ... nilainya?

Bukankah akan jauh lebih mudah jika array Anda dideklarasikan seperti ini:

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

Itu akan memungkinkan Anda untuk menggunakan nilai-nilai Anda keysebagai indeks untuk mengakses array ...

Dan Anda akan dapat menggunakan fungsi untuk mencari nilai, seperti array_search():

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

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

var_dump($array);

Lebih mudah dibandingkan dengan array Anda, bukan?



Sebagai gantinya, dengan array Anda yang terlihat seperti ini:

$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'), 
);

Anda harus mengulang semua item, untuk menganalisis value, dan membatalkan set item yang tepat:

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

Bahkan jika bisa, tidak sesederhana itu ... dan saya bersikeras: tidak bisakah Anda mengubah format array Anda, untuk bekerja dengan sistem kunci / nilai yang lebih sederhana?

Pascal MARTIN
sumber
"Anda harus mengulang semua item, untuk menganalisis nilainya". Saat Anda menggunakan array_search, Anda mungkin juga mencari melalui semua item.
Nicolas Aoki
96
  ...

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



  return array_values($array);
  ...
ADFS
sumber
3
Terima kasih, saya hanya mencari ini.! :)
Ravi Dhoriya ツ
2
baik dan mudah . hanya mencari ini
Faisal Mehmood Awan
Ini adalah jawaban yang benar, bukan yang diperiksa.
A. Seddighi
16
$key = array_search("Mark As Spam", $array);
unset($array[$key]);

Untuk array 2D ...

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

Anda bisa menggunakan ini

unset($dataArray['key']);
Anirban Das
sumber
3

Mengapa tidak menggunakan array_diff?

$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);

Perhatikan saja bahwa array Anda akan diindeks ulang.

Mikel Annjuk
sumber
1

Coba ini:

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

/ edit Seperti yang disebutkan oleh JohnP, metode ini hanya berfungsi untuk array yang tidak bersarang.

Puncak gunung
sumber
0

Cara untuk melakukan ini dengan mengambil larik target bersarang Anda dan menyalinnya dalam satu langkah ke larik yang tidak bersarang. Hapus kunci dan kemudian tetapkan larik terpangkas terakhir ke simpul bersarang dari larik sebelumnya. Berikut adalah kode untuk membuatnya sederhana:

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

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

$list['resultset'][0] = $temp_array;
Nitish Pandey
sumber
0

Saya agak tidak setuju dengan jawaban yang diterima. Terkadang arsitektur aplikasi tidak ingin Anda mengacaukan id array, atau membuatnya tidak nyaman. Misalnya, saya cukup sering menggunakan CakePHP, dan kueri database mengembalikan kunci utama sebagai nilai di setiap catatan, sangat mirip dengan yang di atas.

Dengan asumsi array tidak terlalu besar, saya akan menggunakan array_filter. Ini akan membuat salinan larik, tanpa catatan yang ingin Anda hapus, yang dapat Anda tetapkan kembali ke variabel larik asli.

Meskipun ini mungkin tampak tidak efisien, sebenarnya sangat populer akhir-akhir ini untuk memiliki variabel yang tidak dapat diubah, dan fakta bahwa sebagian besar fungsi array php mengembalikan array baru daripada futzing dengan aslinya menyiratkan bahwa PHP agak ingin Anda melakukan ini juga. Dan semakin Anda bekerja dengan array, dan menyadari betapa sulit dan menjengkelkannya fungsi unset (), pendekatan ini sangat masuk akal.

Bagaimanapun:

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

Anda dapat menggunakan logika inklusi apa pun (mis. Bidang id Anda) di fungsi tertanam yang Anda inginkan.

Roger Kaplan
sumber
-1

untuk penggunaan Item array tunggal reset($item)

Ivan Proskuryakov
sumber
Fungsi reset harus digunakan untuk memindahkan pointer array internal, bukan untuk menghapus item atau menghapus item dari array. Gunakan unset sebagai gantinya. Jika solusi Anda berhasil, itu juga memiliki efek samping yang tidak diinginkan.
David