PHP ลบองค์ประกอบออกจากอาร์เรย์ที่เชื่อมโยง


100

ฉันมีอาร์เรย์ PHP ที่มีลักษณะดังนี้:

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

เมื่อฉัน var_dump ค่าอาร์เรย์ฉันได้รับสิ่งนี้:

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

ผมอยากที่จะลบเสร็จสมบูรณ์และมาร์คเป็นสแปม ฉันรู้ว่าทำได้unset[$array[3],$array[4])แต่ปัญหาคือบางครั้งเลขดัชนีอาจแตกต่างกัน

มีวิธีลบออกโดยการจับคู่ชื่อค่าแทนค่าคีย์หรือไม่?


ไม่แน่ใจว่าฉันเข้าใจคำถามตรงนี้หรือไม่ คุณหมายถึงอะไรบางครั้งหมายเลขดัชนีอาจแตกต่างกัน?
Simon H

คำตอบ:


153

อาร์เรย์ของคุณค่อนข้างแปลก: ทำไมไม่ใช้keyas index และvalueas ... value ล่ะ?

มันจะง่ายกว่าไหมถ้าอาร์เรย์ของคุณถูกประกาศแบบนี้:

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

ที่จะช่วยให้คุณใช้ค่าของคุณkeyเป็นดัชนีเพื่อเข้าถึงอาร์เรย์ ...

และคุณสามารถใช้ฟังก์ชันเพื่อค้นหาค่าต่างๆเช่นarray_search():

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

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

var_dump($array);

ง่ายกว่าด้วยอาร์เรย์ของคุณไม่?



แทนด้วยอาร์เรย์ของคุณที่มีลักษณะเช่นนี้:

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

คุณจะต้องวนซ้ำรายการทั้งหมดเพื่อวิเคราะห์valueและยกเลิกการตั้งค่ารายการที่ถูกต้อง:

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

แม้ว่าจะทำได้ แต่ก็ไม่ง่ายอย่างนั้น ... และฉันยืนยัน: คุณไม่สามารถเปลี่ยนรูปแบบของอาร์เรย์ของคุณเพื่อทำงานกับระบบคีย์ / ค่าที่ง่ายกว่านี้ได้หรือไม่?


"คุณจะต้องวนซ้ำรายการทั้งหมดเพื่อวิเคราะห์มูลค่า" เมื่อคุณใช้ array_search คุณอาจค้นหารายการทั้งหมดได้
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
ขอบคุณฉันกำลังมองหาสิ่งนี้เท่านั้น! :)
Ravi Dhoriya ツ

2
ดีและง่าย เพียงแค่มองหาสิ่งนี้
Faisal Mehmood Awan

นี่คือคำตอบที่แท้จริงไม่ใช่ที่ตรวจสอบ
A.Seddighi

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

สำหรับอาร์เรย์ 2D ...

$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

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

โปรดทราบว่าอาร์เรย์ของคุณจะถูกจัดทำดัชนีใหม่


1

ลองสิ่งนี้:

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

/ แก้ไขดังที่กล่าวโดย JohnP วิธีนี้ใช้ได้กับอาร์เรย์ที่ไม่ซ้อนกันเท่านั้น


0

วิธีดำเนินการนี้เพื่อนำอาร์เรย์เป้าหมายที่ซ้อนกันของคุณและคัดลอกในขั้นตอนเดียวไปยังอาร์เรย์ที่ไม่ซ้อนกัน ลบคีย์จากนั้นกำหนดอาร์เรย์ที่ตัดแต่งสุดท้ายให้กับโหนดที่ซ้อนกันของอาร์เรย์ก่อนหน้านี้ นี่คือรหัสที่จะทำให้ง่าย:

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

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

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

0

ฉันไม่เห็นด้วยกับคำตอบที่ยอมรับ บางครั้งสถาปัตยกรรมของแอปพลิเคชันไม่ต้องการให้คุณยุ่งกับรหัสอาร์เรย์หรือทำให้ไม่สะดวก ตัวอย่างเช่นฉันใช้ CakePHP ค่อนข้างมากและแบบสอบถามฐานข้อมูลจะส่งคืนคีย์หลักเป็นค่าในแต่ละระเบียนซึ่งคล้ายกับข้างต้นมาก

สมมติว่าอาร์เรย์ไม่ใหญ่มากฉันจะใช้ array_filter สิ่งนี้จะสร้างสำเนาของอาร์เรย์ลบระเบียนที่คุณต้องการลบซึ่งคุณสามารถกำหนดกลับไปยังตัวแปรอาร์เรย์เดิมได้

แม้ว่าสิ่งนี้อาจดูเหมือนไม่มีประสิทธิภาพ แต่จริงๆแล้วในสมัยนี้มีตัวแปรที่ไม่เปลี่ยนรูปและความจริงที่ว่าฟังก์ชันอาร์เรย์ php ส่วนใหญ่จะส่งคืนอาร์เรย์ใหม่แทนที่จะเป็นฟิวเจอร์สโดยมีนัยว่า PHP ต้องการให้คุณทำเช่นนี้ด้วย ยิ่งคุณทำงานกับอาร์เรย์มากเท่าไหร่และตระหนักว่าฟังก์ชัน unset () นั้นยากและน่ารำคาญเพียงใดวิธีการนี้ก็สมเหตุสมผลมาก

อย่างไรก็ตาม:

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

คุณสามารถใช้ตรรกะการรวมอะไรก็ได้ (เช่นฟิลด์ id ของคุณ) ในฟังก์ชันฝังตัวที่คุณต้องการ


-1

สำหรับการใช้รายการอาร์เรย์เดียว reset($item)


ควรใช้ฟังก์ชันรีเซ็ตเพื่อย้ายตัวชี้อาร์เรย์ภายในไม่ใช่เพื่อลบรายการหรือยกเลิกการตั้งค่ารายการจากอาร์เรย์ ใช้ unset แทน หากวิธีการแก้ปัญหาของคุณได้ผลก็มีผลข้างเคียงที่ไม่ต้องการเช่นกัน
เดวิด
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.