วิธีการลบองค์ประกอบแถวลำดับและแถวลำดับดัชนีอีกครั้งได้อย่างไร


206

ฉันมีปัญหากับอาร์เรย์ ฉันมีหนึ่งอาร์เรย์ที่ฉันต้องการแก้ไขเหมือนด้านล่าง ฉันต้องการที่จะลบองค์ประกอบ (องค์ประกอบ) ของมันโดยดัชนีแล้วอาร์เรย์ดัชนีอีกครั้ง เป็นไปได้ไหม?

$foo = array(

    'whatever', // [0]
    'foo', // [1]
    'bar' // [2]

);

$foo2 = array(

    'foo', // [0], before [1]
    'bar' // [1], before [2]

);

คำตอบ:


456
unset($foo[0]); // remove item at index 0
$foo2 = array_values($foo); // 'reindex' array

6
นี่คือสิ่งที่ฉันต้องการโพสต์ +1
Michiel Pater

4
นี่เป็นวิธีที่ดีกว่าวิธีแก้ปัญหาการหลอกลวงหากต้องการลบหลายรายการพร้อมกัน - หากมีการรวบรวมดัชนีของรายการเหล่านั้นไว้ล่วงหน้า เมื่อคุณใช้ array_splice ในรายการแรกคุณจะสูญเสียดัชนีของรายการที่เหลือ
Jānis Elmeris

23
มันอาจจะเป็นที่น่าสังเกตว่าคุณสามารถล้างค่าหลายตัวแปร / ดัชนีอาร์เรย์ในสายเดียวล้างunset($foo[0], $foo[3], $bar[1]);
ᴍᴀᴛᴛʙᴀᴋᴇʀ

วิธีแก้ปัญหาที่ดีมาก :)
Michael Kisilenko

ฉันใช้สิ่งนี้ ขอบคุณ. ฉันใช้array_spliceและมันไม่ได้ผลกับดัชนีที่ 0 และที่ 1
theGreenCabbage


29

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


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

1
ในขณะที่สิ่งนี้มีความสัมพันธ์กันแบบตั้งฉากคำถามจะอธิบายอย่างชัดเจนเกี่ยวกับองค์ประกอบใด ๆของอาร์เรย์ไม่ใช่แค่คำถามแรก
Félix Gagnon-Grenier


9
Unset($array[0]); 

Sort($array); 

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


9
แม้ว่าคีย์จะถูกกำหนดใหม่ในคำตอบที่ถูกต้องคำสั่งเริ่มต้นจะถูกเก็บไว้
s3v3n

1
"ฉันต้องการที่จะลบองค์ประกอบ (องค์ประกอบ) ของมันโดยดัชนีแล้วอาร์เรย์ดัชนีอีกครั้งมันเป็นไปได้หรือไม่" @ s3v3n OP ไม่เคยขอให้รักษาลำดับเริ่มต้น ฉันให้โซลูชันที่ใช้งานได้และทำงานตามที่ระบุไว้
frostymarvelous

1
คำถามคือ 2 ปี ปล่อยมันไป!
s3v3n

@ s3v3n มันไม่ได้เป็นความเสียใจ ฉันแค่อยากรู้ว่าทำไม เห็นได้ชัดว่าจะปรับปรุงในคำตอบในภายหลัง ฉันยอมรับว่ามีวิธีการที่ดีกว่า แต่มีเหตุผลที่คำตอบนี้แย่ใช่ไหม มันคือประสิทธิภาพหรือไม่ etc? เหตุผลเดียวกันกับที่ฉันเรียนรู้และสอน
frostymarvelous

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


0

นอกจากคำตอบของ xzyfer แล้ว

ฟังก์ชั่น

function custom_unset(&$array=array(), $key=0) {
    if(isset($array[$key])){

        // remove item at index
        unset($array[$key]);

        // 'reindex' array
        $array = array_values($array);

        //alternatively
        //$array = array_merge($array); 

    }
    return $array;
}

ใช้

$my_array=array(
    0=>'test0', 
    1=>'test1', 
    2=>'test2'
);

custom_unset($my_array, 1);

ผลลัพธ์

 array(2) {
    [0]=>
    string(5) "test0"
    [1]=>
    string(5) "test2"
  }

0

หากคุณใช้array_mergeสิ่งนี้จะทำดัชนีคีย์ใหม่ คู่มือการใช้งาน:

ค่าในอาร์เรย์อินพุตที่มีคีย์ตัวเลขจะถูกกำหนดหมายเลขใหม่ด้วยคีย์ที่เพิ่มขึ้นโดยเริ่มจากศูนย์ในอาร์เรย์ผลลัพธ์

http://php.net/manual/en/function.array-merge.php

นี่คือที่ฉันพบคำตอบเดิม

http://board.phpbuilder.com/showthread.php?10299961-Reset-index-on-array-after-unset ()

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