การลบองค์ประกอบออกจากอาร์เรย์ใน PHP


2513

มีวิธีง่าย ๆ ในการลบองค์ประกอบออกจากอาร์เรย์โดยใช้ PHP ซึ่งforeach ($array)ไม่รวมองค์ประกอบนั้นอีกต่อไปหรือไม่

ฉันคิดว่าการตั้งค่าให้nullทำ แต่ดูเหมือนจะไม่ทำงาน


14
ฉันจะไม่ตอบว่าคอนราดเป็นคำตอบที่ง่ายที่สุดสำหรับปัญหาที่ระบุ ด้วยunset()การวนซ้ำในอาร์เรย์จะไม่รวมค่าที่ถูกลบอีกต่อไป OTOH มันเป็นความจริงที่คำตอบของ Stevan นั้นเพียงพอและจริงๆแล้วคือคำตอบที่ฉันกำลังมองหา - แต่ไม่ใช่ OP :)
brandizzi

32
@danip การหาง่ายในคู่มือไม่ได้ขัดขวางคำถามใน StackOverflow หากคำถามนั้นเป็นคำถาม StackOverflow ที่ซ้ำกันคำถามนั้นอาจไม่อยู่ที่นี่ StackOverflow เป็นสถานที่ที่ดีในการค้นหาคำตอบเป็นตัวเลือกไปก่อนแม้ในคู่มือ
Dan Nissenbaum

5
@unset (อาร์เรย์ $ [$ คีย์]); $ array = array_values ​​($ array);
โทรจัน

คำถามที่เกี่ยวข้องเกี่ยวกับการลบสิ่งนี้ในลูป foreach: stackoverflow.com/questions/1949259/…
เลโกลัส

หากคุณต้องการลบกุญแจออกจากอาเรย์อาเรย์ (อาเรย์ที่เกี่ยวข้อง) ดูวิธีแก้ไขปัญหาที่stackoverflow.com/a/47978980/1045444
Somnath Muluk

คำตอบ:


2871

มีวิธีที่แตกต่างกันในการลบองค์ประกอบอาเรย์ซึ่งบางอันมีประโยชน์มากกว่าสำหรับงานเฉพาะบางอย่าง

ลบองค์ประกอบอาร์เรย์หนึ่งรายการ

หากคุณต้องการลบองค์ประกอบอาเรย์หนึ่งตัวคุณสามารถใช้unset()หรือ\array_splice()ไม่ก็ได้

นอกจากนี้หากคุณมีค่าและไม่ทราบว่ากุญแจสำคัญในการลบองค์ประกอบที่คุณสามารถใช้\array_search()เพื่อรับกุญแจ

unset()

โปรดทราบว่าเมื่อคุณใช้unset()คีย์อาร์เรย์จะไม่เปลี่ยน / ทำดัชนีใหม่ หากคุณต้องการทำดัชนีคีย์ใหม่คุณสามารถใช้\array_values()หลังจากนั้นunset()จะแปลงคีย์ทั้งหมดเป็นคีย์ตัวเลขนับตั้งแต่ 0

รหัส

<?php

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

?>

เอาท์พุต

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

\array_splice() วิธี

หากคุณใช้\array_splice()คีย์จะได้รับการทำดัชนีใหม่โดยอัตโนมัติ แต่รหัสที่เชื่อมโยงจะไม่เปลี่ยนแปลงเมื่อเทียบกับ\array_values()ที่จะแปลงคีย์ทั้งหมดเป็นคีย์ตัวเลข

ด้วย \array_splice()ต้องการการชดเชยไม่ใช่กุญแจ! เป็นพารามิเตอร์ที่สอง

รหัส

<?php

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

?>

เอาท์พุต

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

array_splice()เช่นเดียวกับการunset()ใช้อาร์เรย์โดยอ้างอิงและนี่หมายความว่าคุณไม่ต้องการกำหนดค่าส่งคืนของฟังก์ชันเหล่านั้นกลับไปที่อาร์เรย์

ลบองค์ประกอบอาร์เรย์หลายรายการ

หากคุณต้องการลบองค์ประกอบหลายชุดและไม่ต้องการโทรunset()หรือ\array_splice()หลายครั้งคุณสามารถใช้ฟังก์ชั่น\array_diff()หรือ\array_diff_key()ขึ้นอยู่กับว่าคุณรู้ค่าหรือปุ่มขององค์ประกอบที่คุณต้องการลบ

\array_diff() วิธี

\array_diff()ถ้าคุณรู้ว่าคุณค่าขององค์ประกอบมากมายที่คุณต้องการลบแล้วคุณสามารถใช้ ก่อนหน้าunset()นี้มันจะไม่เปลี่ยน / ทำดัชนีคีย์ของอาร์เรย์อีก

รหัส

<?php

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

?>

เอาท์พุต

[
    [1] => b
]

\array_diff_key() วิธี

หากคุณรู้ถึงองค์ประกอบต่าง ๆ ที่คุณต้องการลบคุณต้องใช้\array_diff_key()มัน ที่นี่คุณต้องตรวจสอบให้แน่ใจว่าคุณผ่านคีย์เป็นคีย์ในพารามิเตอร์ที่สองไม่ใช่ค่า มิฉะนั้นคุณต้องพลิกอาร์เรย์ด้วย\array_flip()มิฉะนั้นคุณจะต้องพลิกอาร์เรย์ด้วยและที่นี่กุญแจจะไม่เปลี่ยน / ทำดัชนีใหม่

รหัส

<?php

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

เอาท์พุต

[
    [1] => b
]

นอกจากนี้หากคุณต้องการใช้unset()หรือ\array_splice()ลบองค์ประกอบหลายรายการด้วยค่าเดียวกันคุณสามารถใช้\array_keys()เพื่อรับคีย์ทั้งหมดสำหรับค่าเฉพาะแล้วลบองค์ประกอบทั้งหมด


25
@AlexandruRada ไม่คุณพูดว่า“ อย่าใช้สิ่งนี้” - และนั่นก็ไร้สาระ คุณสามารถใช้วิธีนี้ได้อย่างปลอดภัยเมื่อคุณปฏิบัติกับอาเรย์ว่ามันคืออะไร - พจนานุกรม เฉพาะในกรณีที่คุณคาดว่าจะมีดัชนีตัวเลขติดต่อกันคุณจำเป็นต้องใช้อย่างอื่น
Konrad Rudolph

2
@Alexander ใช้array_spliceตามที่อธิบายไว้ในคำตอบอื่น ๆ
Konrad Rudolph

1
@AlexandruRada ไม่มีทางที่คุณจะได้array (3) { [0]=>int(0) ...เมื่อคุณunset($x[2])จาก$x = array(1, 2, 3, 4);ผลลัพธ์ต้องเป็นvar_dump($x); // array(3) { [0]=> int(1) [1]=> int(2) [3]=> int(4) }(มันอาจเป็นตัวพิมพ์ใหญ่ผิดปกติ)
inemanja

5
unsetvoid unset ( mixed $var [, mixed $... ] )สามารถมีข้อโต้แย้งหลาย
КонстантинВан

3
array_filter ยังเป็นวิธีที่ทำงานได้ ดีเป็นพิเศษหากคุณไม่ต้องการที่จะกลายพันธุ์อาเรย์ แต่ก็ไม่ได้ทำดัชนีใหม่ซึ่งอาจเป็นปัญหากับ json_encode php.net/manual/en/function.json-encode.php#94157
dotnetCarpenter

1358

ควรสังเกตว่าunset()จะทำให้ดัชนีไม่มีการแตะต้องซึ่งเป็นสิ่งที่คุณคาดหวังเมื่อใช้ดัชนีสตริง (อาร์เรย์เป็น hashtable) แต่อาจเป็นเรื่องที่น่าแปลกใจเมื่อจัดการกับอาร์เรย์ที่จัดทำดัชนีจำนวนเต็ม:

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

ดังนั้นarray_splice()สามารถใช้งานได้หากคุณต้องการทำให้คีย์จำนวนเต็มเป็นปกติ ตัวเลือกอื่นกำลังใช้งานarray_values()หลังจาก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)
} */

42
มันน่าสังเกตว่าเมื่อคุณกำลังใช้ array_splice () ที่คุณต้องการที่จะรู้ว่า OFFSET ไม่สำคัญ แต่ offset ของสิ่งที่องค์ประกอบที่คุณต้องการที่จะลบ (!)
ทอม

18
@Tom: สำหรับอาร์เรย์ปกติ (ที่ต่อเนื่องเป็นจำนวนเต็มดัชนี) offset เป็นดัชนี นั่นคือสิ่งที่array_spliceทำให้รู้สึก (ในหมู่คนอื่น)
Stefan Gehrig

5
ใช่แน่นอน แต่มีเพียงบางสิ่งที่ต้องจำถ้าคุณยุ่งกับอาเรย์ก่อนที่จะใช้ประกบกัน
Tom

4
จากการทดสอบพื้นฐานของการลบองค์ประกอบมากมายจากอาร์เรย์ขนาดใหญ่ array_splice ดูเหมือนว่าจะเร็วกว่าและมีหน่วยความจำน้อยลง สิ่งนี้ตรงกับสิ่งที่ฉันคาดหวัง: array_values ​​() ดูเหมือนว่าจะสร้างสำเนาของอาร์เรย์ในขณะที่ array_splice ทำงานแทน
Doug Kavendek

4
array_values ​​เป็นวิธีที่มีประโยชน์เมื่อคุณลบองค์ประกอบในลูปและต้องการให้ดัชนีสอดคล้องกัน แต่ต้องการบีบอัดออกหลังจากลูป
Rorrik

370
  // 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);

นี่คือผลลัพธ์จากโค้ดด้านบน:

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
)

ตอนนี้ array_values ​​() จะจัดทำดัชนีอาร์เรย์อีกครั้ง แต่จะลบสตริงคีย์ทั้งหมดออกจากอาร์เรย์และแทนที่ด้วยตัวเลข หากคุณต้องการเก็บชื่อคีย์ (สตริง) หรือสร้างดัชนีใหม่หากคีย์ทั้งหมดเป็นตัวเลขให้ใช้ array_merge ():

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

เอาท์พุท

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

$ get_merged_values ​​= array_merge ($ data ['res'], $ data ['check_res']); เมื่อฉันพิมพ์ print_r นี้ ($ get_merged_values); มันแสดงดังต่อไปนี้ Array ([0] => Array ([menu_code] => 2 [menu_name] => โรงงาน [menu_order_no] => 1) [1] => Array ([menu_code] => 3 [menu_order_no] => 2)) แต่ฉันต้องได้รับค่าของ menu_code และ menu_name โดยใช้ $ get_merged_values ​​['menu_code'] และ $ get_merged_values ​​['menu_name'] ตามลำดับแทนที่จะใช้ $ get_merged_values ​​[0] [menu_code], $ get_merged_values ​​[0] ] [MENU_NAME] โปรดช่วยฉันทำอย่างไร?
แฮ็กเกอร์หัวใจ

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

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


65

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

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

ตัวอย่างเช่น:

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

สิ่งนี้แสดงสิ่งต่อไปนี้:

4
3

ในตัวอย่างนี้องค์ประกอบที่มีค่า 'Charles' จะถูกลบออกตามที่สามารถตรวจสอบได้โดยการโทร sizeof () ที่รายงานขนาด 4 สำหรับอาร์เรย์เริ่มต้นและ 3 หลังจากการลบ


64

นอกจากนี้สำหรับองค์ประกอบที่ระบุชื่อ:

unset($array["elementName"]);

$a = array("A"=>1, "B"=>2, "C"=>"a"); print_r($a); unset($a["B"]); print_r($a); ให้ (จัดรูปแบบ): Array ( [A] => 1 [B] => 2 [C] => a ), Array ( [A] => 1 [C] => a )
DefenestrationDay

ดูเหมือนว่าคุณไม่สามารถยกเลิกการตั้งค่าองค์ประกอบของอาเรย์ที่จัดทำดัชนีโดยสตริง (สร้าง "ข้อผิดพลาดร้ายแรง: ไม่สามารถยกเลิกการตั้งค่าสตริงได้") ฉันไม่คิดว่านี่เป็นกรณีเสมอไป แต่แน่นอนว่าเป็น PHP 5.3.10 และน่าจะเร็วกว่านี้
carpii

6
@carpii PHP สามารถแยกองค์ประกอบออกจากอาเรย์แบบเชื่อมโยงได้ ข้อผิดพลาดร้ายแรงเกิดขึ้นเมื่อคุณพยายามใช้ unset ($ var ['key']) ในสตริงแทนอาร์เรย์ตัวอย่างเช่น: $ array = array ('test' => 'value', 'another' => ' ค่า ',); ไม่มีการตั้งค่า (อาร์เรย์ $ [ 'ทดสอบ']); // ลบองค์ประกอบ "test" ออกจากอาร์เรย์ตามที่คาดไว้ $ array = 'test'; ไม่มีการตั้งค่า (อาร์เรย์ $ [ 'ทดสอบ']); // โยน "ข้อผิดพลาดร้ายแรง: ไม่สามารถยกเลิกการตั้งค่าสตริง" ตามที่คาดไว้
Jimbo

ที่นี่คุณต้องรู้จักชื่อคีย์ดีกว่า: stackoverflow.com/a/52826684/1407491
Nabi KAZ

33

ทำลายองค์ประกอบเดียวของอาร์เรย์

unset()

$array1 = array('A', 'B', 'C', 'D', 'E');
unset($array1[2]); // Delete known index(2) value from array
var_dump($array1);

ผลลัพธ์จะเป็น:

array(4) {
  [0]=>
  string(1) "A"
  [1]=>
  string(1) "B"
  [3]=>
  string(1) "D"
  [4]=>
  string(1) "E"
}

หากคุณต้องการทำดัชนีอาร์เรย์อีกครั้ง:

$array1 = array_values($array1);
var_dump($array1);

จากนั้นผลลัพธ์จะเป็น:

array(4) {
  [0]=>
  string(1) "A"
  [1]=>
  string(1) "B"
  [2]=>
  string(1) "D"
  [3]=>
  string(1) "E"
}

นำองค์ประกอบออกจากท้ายอาร์เรย์ - คืนค่าขององค์ประกอบที่ถูกลบออก

mixed array_pop(array &$array)

$stack = array("orange", "banana", "apple", "raspberry");
$last_fruit = array_pop($stack);
print_r($stack);
print_r('Last Fruit:'.$last_fruit); // Last element of the array

ผลลัพธ์จะเป็น

Array
(
    [0] => orange
    [1] => banana
    [2] => apple
)
Last Fruit: raspberry

ลบองค์ประกอบแรก (สีแดง) จากอาร์เรย์ - คืนค่าขององค์ประกอบที่ถูกลบ

mixed array_shift ( array &$array )

$color = array("a" => "red", "b" => "green" , "c" => "blue");
$first_color = array_shift($color);
print_r ($color);
print_r ('First Color: '.$first_color);

ผลลัพธ์จะเป็น:

Array
(
    [b] => green
    [c] => blue
)
First Color: red

1
การarray_shiftสร้างดัชนีรายการคีย์หากเป็นจำนวนเต็มจึงไม่ดีดังนั้นคุณสามารถใช้สิ่งนี้: stackoverflow.com/a/52826684/1407491
Nabi KAZ

33
<?php
    $stack = ["fruit1", "fruit2", "fruit3", "fruit4"];
    $fruit = array_shift($stack);
    print_r($stack);

    echo $fruit;
?>

เอาท์พุท:

[
    [0] => fruit2
    [1] => fruit3
    [2] => fruit4
]

fruit1

14
โปรดทราบว่าarray_shiftสามารถลบองค์ประกอบแรกในอาร์เรย์ได้เท่านั้น ใช้ในทำนองเดียวกันarray_popเพื่อลบองค์ประกอบสุดท้ายในอาร์เรย์
Jasir

1
คำตอบนั้นใช้ได้กับองค์ประกอบแรกของอาร์เรย์เท่านั้นและไม่ตอบคำถามทั่วไป
sweisgerber.dev

@ sebweisgerber คุณพูดถูก แต่ฉันไม่คิดว่ามันผิดและจำเป็นต้องลงคะแนนนี่ คำถามคือลบองค์ประกอบที่ไม่พูดถึงตำแหน่งใด ๆ
Saurabh Chandra Patel

27

เพื่อหลีกเลี่ยงการค้นหาสามารถเล่นกับarray_diff:

$array = array(3, 9, 11, 20);
$array = array_diff($array, array(11) ); // removes 11

ในกรณีนี้เราไม่จำเป็นต้องค้นหา / ใช้กุญแจ


21

หากคุณต้องลบหลายค่าในอาเรย์และรายการในอาเรย์นั้นเป็นวัตถุหรือข้อมูลที่มีโครงสร้าง[array_filter][1]เป็นทางออกที่ดีที่สุดของคุณ รายการที่ส่งคืนค่าจริงจากฟังก์ชันการเรียกกลับจะถูกเก็บไว้

$array = [
    ['x'=>1,'y'=>2,'z'=>3], 
    ['x'=>2,'y'=>4,'z'=>6], 
    ['x'=>3,'y'=>6,'z'=>9]
];

$results = array_filter($array, function($value) {
    return $value['x'] > 2; 
}); //=> [['x'=>3,'y'=>6,z=>'9']]

20

อาร์เรย์ที่เกี่ยวข้อง

สำหรับอาร์เรย์ที่เชื่อมโยงให้ใช้unset:

$arr = array('a' => 1, 'b' => 2, 'c' => 3);
unset($arr['b']);

// RESULT: array('a' => 1, 'c' => 3)

อาร์เรย์ตัวเลข

สำหรับอาร์เรย์ตัวเลขให้ใช้array_splice:

$arr = array(1, 2, 3);
array_splice($arr, 1, 1);

// RESULT: array(0 => 1, 1 => 3)

บันทึก

การใช้unsetอาร์เรย์ตัวเลขจะไม่เกิดข้อผิดพลาด แต่จะทำให้ดัชนีของคุณยุ่งเหยิง:

$arr = array(1, 2, 3);
unset($arr[1]);

// RESULT: array(0 => 1, 2 => 3)

19

หากคุณต้องการลบหลายองค์ประกอบออกจากอาเรย์แบบเชื่อมโยงคุณสามารถใช้array_diff_key () (นี่ใช้กับarray_flip () ):

$my_array = array(
  "key1" => "value 1",
  "key2" => "value 2",
  "key3" => "value 3",
  "key4" => "value 4",
  "key5" => "value 5",
);

$to_remove = array("key2", "key4");

$result = array_diff_key($my_array, array_flip($to_remove));

print_r($result);

เอาท์พุท:

Array ( [key1] => value 1 [key3] => value 3 [key5] => value 5 ) 

ทำไมการประเมินจึงต่ำเกินไป
Fr0zenFyr

19

unset() ทำลายตัวแปรที่ระบุ

พฤติกรรมของ unset()ภายในของฟังก์ชั่นอาจแตกต่างกันไปขึ้นอยู่กับชนิดของตัวแปรที่คุณพยายามทำลาย

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

<?php
    function destroy_foo()
    {
        global $foo;
        unset($foo);
    }

    $foo = 'bar';
    destroy_foo();
    echo $foo;
?>

คำตอบของรหัสข้างต้นจะเป็นแถบบาร์

สำหรับunset()ตัวแปรโกลบอลภายในฟังก์ชัน:

<?php
    function foo()
    {
        unset($GLOBALS['bar']);
    }

    $bar = "something";
    foo();
?>


12

หากระบุดัชนี:

$arr = ['a', 'b', 'c'];
$index = 0;    
unset($arr[$index]);  // $arr = ['b', 'c']

หากไม่ได้ระบุดัชนี:

$arr = ['a', 'b', 'c'];
$index = array_search('a', $arr); // search the value to find index
if($index !== false){
   unset($arr[$index]);  // $arr = ['b', 'c']
}

ifสภาพเป็นสิ่งจำเป็นเพราะถ้าindexไม่พบunset()จะลบองค์ประกอบแรกของอาร์เรย์โดยอัตโนมัติซึ่งไม่ได้เป็นสิ่งที่เราต้องการ


1
หากไม่พบค่ามันจะลบองค์ประกอบแรก เพิ่มในการทดสอบสำหรับ unset: if ($ index! == false) unset ($ arr [$ index]);
MyRealNameIsBlaze

@MyRealNameIsBlaze ขอบคุณคงที่
Ahmad Mobaraki

9

Solutions:

  1. หากต้องการลบองค์ประกอบหนึ่งให้ใช้unset () :
unset($array[3]);
unset($array['foo']);
  1. ในการลบองค์ประกอบที่ไม่ต่อเนื่องหลายองค์ประกอบให้ใช้unset () :
unset($array[3], $array[5]);
unset($array['foo'], $array['bar']);
  1. ในการลบองค์ประกอบที่อยู่ติดกันหลายรายการให้ใช้array_splice () :
array_splice($array, $offset, $length);

คำอธิบายเพิ่มเติม:

การใช้ฟังก์ชั่นเหล่านี้จะลบการอ้างอิงทั้งหมดไปยังองค์ประกอบเหล่านี้จาก PHP หากคุณต้องการเก็บคีย์ไว้ในอาร์เรย์ แต่ด้วยค่าว่างให้กำหนดสตริงว่างให้กับองค์ประกอบ:

$array[3] = $array['foo'] = '';

นอกจากไวยากรณ์แล้วยังมีความแตกต่างทางตรรกะระหว่างการใช้unset ()และการกำหนด '' ให้กับองค์ประกอบ ตัวแรกบอกว่าThis doesn't exist anymore,ในขณะที่ตัวที่สองบอกว่าThis still exists, but its value is the empty string.

หากคุณกำลังติดต่อกับตัวเลขการกำหนด 0 อาจเป็นทางเลือกที่ดีกว่า ดังนั้นหาก บริษัท หยุดการผลิตรุ่น XL1000 เฟืองมันจะอัปเดตสินค้าคงคลังด้วย:

unset($products['XL1000']);

อย่างไรก็ตามถ้ามันหมดไปจากเฟือง XL1000 ชั่วคราว แต่กำลังวางแผนที่จะรับการจัดส่งใหม่จากโรงงานในปลายสัปดาห์นี้มันจะดีกว่า:

$products['XL1000'] = 0;

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

// Create a "numeric" array
$animals = array('ant', 'bee', 'cat', 'dog', 'elk', 'fox');
print $animals[1];  // Prints 'bee'
print $animals[2];  // Prints 'cat'
count($animals);    // Returns 6

// unset()
unset($animals[1]); // Removes element $animals[1] = 'bee'
print $animals[1];  // Prints '' and throws an E_NOTICE error
print $animals[2];  // Still prints 'cat'
count($animals);    // Returns 5, even though $array[5] is 'fox'

// Add a new element
$animals[ ] = 'gnu'; // Add a new element (not Unix)
print $animals[1];  // Prints '', still empty
print $animals[6];  // Prints 'gnu', this is where 'gnu' ended up
count($animals);    // Returns 6

// Assign ''
$animals[2] = '';   // Zero out value
print $animals[2];  // Prints ''
count($animals);    // Returns 6, count does not decrease

ในการกระชับอาร์เรย์ให้เป็นอาร์เรย์ตัวเลขที่มีความหนาแน่นสูงให้ใช้array_values ​​() :

$animals = array_values($animals);

หรืออีกทางหนึ่งคือarray_splice () ทำดัชนีอาร์เรย์อีกครั้งโดยอัตโนมัติเพื่อหลีกเลี่ยงการออกจากรู:

// Create a "numeric" array
$animals = array('ant', 'bee', 'cat', 'dog', 'elk', 'fox');
array_splice($animals, 2, 2);
print_r($animals);
Array
(
    [0] => ant
    [1] => bee
    [2] => elk
    [3] => fox
)

สิ่งนี้มีประโยชน์หากคุณกำลังใช้อาร์เรย์เป็นคิวและต้องการลบรายการออกจากคิวในขณะที่ยังอนุญาตการเข้าถึงแบบสุ่ม ในการลบองค์ประกอบแรกหรือองค์ประกอบสุดท้ายออกจากอาร์เรย์อย่างปลอดภัยให้ใช้array_shift ()และarray_pop ()ตามลำดับ


8

สมมติว่าคุณมีอาร์เรย์ดังต่อไปนี้:

Array
(
    [user_id] => 193
    [storage] => 5
)

หากต้องการลบstorageให้ทำ:

unset($attributes['storage']);
$attributes = array_filter($attributes);

และคุณจะได้รับ:

Array
(
    [user_id] => 193
)

อะไรคือสิ่งที่array_filterใช้?
David

เพื่อลบองค์ประกอบที่ผิดพลาด
Tebe

8

ฉันแค่อยากจะบอกว่าฉันมีวัตถุเฉพาะที่มีแอตทริบิวต์ตัวแปร (โดยทั่วไปแล้วคือการจับคู่ตารางและฉันเปลี่ยนคอลัมน์ในตารางดังนั้นคุณลักษณะในวัตถุที่สะท้อนถึงตารางจะแตกต่างกันเช่นกัน):

class obj {
    protected $fields = array('field1','field2');
    protected $field1 = array();
    protected $field2 = array();
    protected loadfields(){}
    // This will load the $field1 and $field2 with rows of data for the column they describe
    protected function clearFields($num){
        foreach($fields as $field) {
            unset($this->$field[$num]);
            // This did not work the line below worked
            unset($this->{$field}[$num]); // You have to resolve $field first using {}
        }
    }
}

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


8

ทำตามฟังก์ชั่นเริ่มต้น:

ผม)

$Array = array("test1", "test2", "test3", "test3");

unset($Array[2]);

ii)

$Array = array("test1", "test2", "test3", "test3");

array_pop($Array);

สาม)

$Array = array("test1", "test2", "test3", "test3");

array_splice($Array,1,2);

iv)

$Array = array("test1", "test2", "test3", "test3");

array_shift($Array);

7
<?php
    $array = array("your array");
    $array = array_diff($array, ["element you want to delete"]);
?>

สร้างอาร์เรย์ของคุณในตัวแปร$arrayแล้วที่ฉันได้ใส่ 'องค์ประกอบที่คุณต้องการลบ' คุณใส่สิ่งที่ชอบ: "a" และถ้าคุณต้องการลบหลายรายการ: "a", "b"


7

ใช้ array_search เพื่อรับรหัสและลบออกโดยไม่ได้ตั้งค่าหากพบ:

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

6

unset () องค์ประกอบหลายรายการแยกส่วนจากอาร์เรย์

แม้ว่าunset()จะถูกกล่าวถึงที่นี่หลายครั้ง แต่ก็ยังไม่ได้รับการกล่าวถึงว่าunset()ยอมรับตัวแปรหลายตัวทำให้ง่ายต่อการลบองค์ประกอบที่ไม่ต่อเนื่องหลายองค์ประกอบจากอาร์เรย์ในการดำเนินการครั้งเดียว:

// Delete multiple, noncontiguous elements from an array
$array = [ 'foo', 'bar', 'baz', 'quz' ];
unset( $array[2], $array[3] );
print_r($array);
// Output: [ 'foo', 'bar' ]

unset () แบบไดนามิก

unset () ไม่ยอมรับอาร์เรย์ของคีย์ที่จะลบดังนั้นโค้ดด้านล่างจะล้มเหลว (มันจะทำให้การใช้ unset () แบบไดนามิกนั้นง่ายขึ้นเล็กน้อย)

$array = range(0,5);
$remove = [1,2];
$array = unset( $remove ); // FAILS: "unexpected 'unset'"
print_r($array);

สามารถใช้ unset () แบบไดนามิกในลูป foreach แทน:

$array = range(0,5);
$remove = [1,2];
foreach ($remove as $k=>$v) {
    unset($array[$v]);
}
print_r($array);
// Output: [ 0, 3, 4, 5 ]

ลบคีย์อาร์เรย์โดยคัดลอกอาร์เรย์

นอกจากนี้ยังมีแนวปฏิบัติอื่นที่ยังไม่ได้กล่าวถึง บางครั้งวิธีที่ง่ายที่สุดในการกำจัดคีย์อาเรย์บางอย่างคือการคัดลอก $ array1 ไปยัง $ array2

$array1 = range(1,10);
foreach ($array1 as $v) {
    // Remove all even integers from the array
    if( $v % 2 ) {
        $array2[] = $v;
    }
}
print_r($array2);
// Output: [ 1, 3, 5, 7, 9 ];

เห็นได้ชัดว่าการปฏิบัติเดียวกันกับสตริงข้อความ:

$array1 = [ 'foo', '_bar', 'baz' ];
foreach ($array1 as $v) {
    // Remove all strings beginning with underscore
    if( strpos($v,'_')===false ) {
        $array2[] = $v;
    }
}
print_r($array2);
// Output: [ 'foo', 'baz' ]

6

ลบองค์ประกอบอาร์เรย์ตามคีย์:

ใช้unsetฟังก์ชั่นด้านล่าง:

$a = array(
       'salam',
       '10',
       1
);

unset($a[1]);

print_r($a);

/*

    Output:

        Array
        (
            [0] => salam
            [2] => 1
        )

*/

ลบองค์ประกอบอาร์เรย์ตามค่า:

ใช้array_searchฟังก์ชั่นเพื่อรับรหัสองค์ประกอบและใช้วิธีการด้านบนเพื่อลบองค์ประกอบอาร์เรย์ดังนี้

$a = array(
       'salam',
       '10',
       1
);

$key = array_search(10, $a);

if ($key !== false) {
    unset($a[$key]);
}

print_r($a);

/*

    Output:

        Array
        (
            [0] => salam
            [2] => 1
        )

*/

6

สองวิธีในการลบรายการแรกของอาร์เรย์ด้วยการรักษาลำดับของดัชนีและหากคุณไม่ทราบชื่อคีย์ของรายการแรก

โซลูชัน # 1

// 1 is the index of the first object to get
// NULL to get everything until the end
// true to preserve keys
$array = array_slice($array, 1, null, true);

โซลูชัน # 2

// Rewinds the array's internal pointer to the first element
// and returns the value of the first array element.
$value = reset($array);
// Returns the index element of the current array position
$key = key($array);
unset($array[$key]);

สำหรับข้อมูลตัวอย่างนี้:

$array = array(10 => "a", 20 => "b", 30 => "c");

คุณต้องมีผลลัพธ์นี้:

array(2) {
  [20]=>
  string(1) "b"
  [30]=>
  string(1) "c"
}

5

ใช้รหัสต่อไปนี้:

$arr = array('orange', 'banana', 'apple', 'raspberry');
$result = array_pop($arr);
print_r($result);

4
php5: เพียงแค่เรียกใช้array_pop($arr)จะลบรายการสุดท้าย ไม่จำเป็นต้อง =
Chris K

5
<?php
    // If you want to remove a particular array element use this method
    $my_array = array("key1"=>"value 1", "key2"=>"value 2", "key3"=>"value 3");

    print_r($my_array);
    if (array_key_exists("key1", $my_array)) {
        unset($my_array['key1']);
        print_r($my_array);
    }
    else {
        echo "Key does not exist";
    }
?>

<?php
    //To remove first array element
    $my_array = array("key1"=>"value 1", "key2"=>"value 2", "key3"=>"value 3");
    print_r($my_array);
    $new_array = array_slice($my_array, 1);
    print_r($new_array);
?>


<?php
    echo "<br/>    ";
    // To remove first array element to length
    // starts from first and remove two element
    $my_array = array("key1"=>"value 1", "key2"=>"value 2", "key3"=>"value 3");
    print_r($my_array);
    $new_array = array_slice($my_array, 1, 2);
    print_r($new_array);
?>

เอาท์พุต

 Array ( [key1] => value 1 [key2] => value 2 [key3] =>
 value 3 ) Array (    [key2] => value 2 [key3] => value 3 )
 Array ( [key1] => value 1 [key2] => value 2 [key3] => value 3 )
 Array ( [key2] => value 2 [key3] => value 3 )
 Array ( [key1] => value 1 [key2] => value 2 [key3] => value 3 )
 Array ( [key2] => value 2 [key3] => value 3 )

4

สำหรับอาร์เรย์ที่เชื่อมโยงโดยใช้คีย์ที่ไม่ใช่จำนวนเต็ม:

เพียงแค่ unset($array[$key])จะทำงาน

สำหรับอาร์เรย์ที่มีคีย์จำนวนเต็มและหากคุณต้องการบำรุงรักษาคีย์:

  1. $array = [ 'mango', 'red', 'orange', 'grapes'];

    unset($array[2]);
    $array = array_values($array);
  2. array_splice($array, 2, 1);


2

สิ่งนี้อาจช่วย ...

<?php
    $a1 = array("a"=>"red", "b"=>"green", "c"=>"blue", "d"=>"yellow");
    $a2 = array("a"=>"purple", "b"=>"orange");
    array_splice($a1, 0, 2, $a2);
    print_r($a1);
?>

ผลลัพธ์จะเป็น:

Array ( [0] => purple [1] => orange [c] => blue [d] => yellow )

2
$arrayName = array( '1' => 'somevalue',
                    '2' => 'somevalue1',
                    '3' => 'somevalue3',
                  );

print_r($arrayName[1]);
// somevalue
unset($arrayName[1]);

print_r($arrayName);
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.