ฉันต้องการลบรายการอาร์เรย์ด้วยค่าที่กำหนด:
if (in_array($id, $items)) {
$items = array_flip($items);
unset($items[ $id ]);
$items = array_flip($items);
}
มันสามารถทำได้ในทางที่สั้นกว่า (มีประสิทธิภาพมากขึ้น)?
ฉันต้องการลบรายการอาร์เรย์ด้วยค่าที่กำหนด:
if (in_array($id, $items)) {
$items = array_flip($items);
unset($items[ $id ]);
$items = array_flip($items);
}
มันสามารถทำได้ในทางที่สั้นกว่า (มีประสิทธิภาพมากขึ้น)?
คำตอบ:
มันสามารถทำได้ด้วยง่ายหนึ่งซับ
มีอาร์เรย์นี้:
$arr = array('nice_item', 'remove_me', 'another_liked_item', 'remove_me_also');
คุณทำได้:
$arr = array_diff($arr, array('remove_me', 'remove_me_also'));
และมูลค่าของ$arr
จะเป็น:
array('nice_item', 'another_liked_item')
หวังว่าจะช่วยเขียนโค้ดที่สวยงาม
array_diff
ฟังก์ชั่นที่ไม่ทำลายก็จะส่งกลับอาร์เรย์ใหม่
$referenced = array_diff($referenced, $items_to_remove);
ฉันกำลังเพิ่มคำตอบที่สอง ฉันเขียนสคริปต์การเปรียบเทียบอย่างรวดเร็วเพื่อลองวิธีการต่างๆที่นี่
$arr = array(0 => 123456);
for($i = 1; $i < 500000; $i++) {
$arr[$i] = rand(0,PHP_INT_MAX);
}
shuffle($arr);
$arr2 = $arr;
$arr3 = $arr;
/**
* Method 1 - array_search()
*/
$start = microtime(true);
while(($key = array_search(123456,$arr)) !== false) {
unset($arr[$key]);
}
echo count($arr). ' left, in '.(microtime(true) - $start).' seconds<BR>';
/**
* Method 2 - basic loop
*/
$start = microtime(true);
foreach($arr2 as $k => $v) {
if ($v == 123456) {
unset($arr2[$k]);
}
}
echo count($arr2). 'left, in '.(microtime(true) - $start).' seconds<BR>';
/**
* Method 3 - array_keys() with search parameter
*/
$start = microtime(true);
$keys = array_keys($arr3,123456);
foreach($keys as $k) {
unset($arr3[$k]);
}
echo count($arr3). 'left, in '.(microtime(true) - $start).' seconds<BR>';
วิธีที่สามซึ่งarray_keys()
ระบุพารามิเตอร์การค้นหาทางเลือกนั้นน่าจะเป็นวิธีที่ดีที่สุด ตัวอย่างผลลัพธ์:
499999 left, in 0.090957164764404 seconds
499999left, in 0.43156313896179 seconds
499999left, in 0.028877019882202 seconds
ตัดสินโดยวิธีแก้ปัญหาที่ฉันจะใช้แล้วจะเป็น:
$keysToRemove = array_keys($items,$id);
foreach($keysToRemove as $k) {
unset($items[$k]);
}
เกี่ยวกับ:
if (($key = array_search($id, $items)) !== false) unset($items[$key]);
หรือหลายค่า:
while(($key = array_search($id, $items)) !== false) {
unset($items[$key]);
}
array_flip()
นี้จะป้องกันการสูญเสียที่สำคัญเช่นกันซึ่งเป็นผลข้างเคียงของ
เพื่อลบออก$rm_val
จาก$arr
unset($arr[array_search($rm_val, $arr)]);
โซลูชันที่ทรงพลังที่สุดจะใช้array_filter
งานซึ่งช่วยให้คุณสามารถกำหนดฟังก์ชั่นการกรองของคุณเอง
แต่บางคนอาจบอกว่ามันค่อนข้างแพงไปหน่อยในสถานการณ์ของคุณ ...
การforeach
วนรอบอย่างง่ายเพื่อไปยังแถวลำดับและเอารายการที่คุณไม่ต้องการนั้นควรจะเพียงพอ
ในกรณีของคุณบางสิ่งเช่นนี้ควรทำเคล็ดลับ:
foreach ($items as $key => $value) {
if ($value == $id) {
unset($items[$key]);
// If you know you only have one line to remove, you can decomment the next line, to stop looping
//break;
}
}
โซลูชันของคุณจะทำงานหากคุณมีค่าที่ไม่ซ้ำกันในอาร์เรย์
ดู:
<?php
$trans = array("a" => 1, "b" => 1, "c" => 2);
$trans = array_flip($trans);
print_r($trans);
?>
วิธีที่ดีกว่าจะถูกยกเลิกการตั้งค่าด้วยarray_searchในลูปถ้าจำเป็น
พลิกโดยไม่ต้อง:
<?php
foreach ($items as $key => $value) {
if ($id === $value) {
unset($items[$key]);
}
}
function deleteValyeFromArray($array,$value)
{
foreach($array as $key=>$val)
{
if($val == $value)
{
unset($array[$key]);
}
}
return $array;
}
คุณสามารถใช้ฟังก์ชัน array_splice สำหรับการดำเนินการนี้ Ref: array_splice
array_splice($array, array_search(58, $array ), 1);