Rebase คีย์อาเรย์หลังจากยกเลิกการตั้งค่าองค์ประกอบ


183

ฉันมีอาเรย์:

$array = array(1,2,3,4,5);

ถ้าฉันจะทิ้งเนื้อหาของอาร์เรย์พวกเขาจะมีลักษณะเช่นนี้:

array(5) {
  [0] => int(1)
  [1] => int(2)
  [2] => int(3)
  [3] => int(4)
  [4] => int(5)
}

เมื่อฉันวนซ้ำและยกเลิกการตั้งค่าคีย์บางอย่างดัชนีจะเพิ่มขึ้นทั้งหมด

foreach($array as $i => $info)
{
  if($info == 1 || $info == 2)
  {
    unset($array[$i]);
  }
}

ต่อจากนั้นถ้าฉันทำดัมพ์อื่นตอนนี้มันจะดูเหมือน:

array(3) {
  [2] => int(3)
  [3] => int(4)
  [4] => int(5)
}

มีวิธีที่เหมาะสมในการรีเซ็ตอาร์เรย์ดังนั้นองค์ประกอบจึงเป็นศูนย์อีกครั้งหรือไม่

array(3) {
  [0] => int(3)
  [1] => int(4)
  [2] => int(5)
}

คำตอบ:


411

ลองสิ่งนี้:

$array = array_values($array);

ใช้array_values ​​()


6
+1 ฉันทราบว่าคู่มือไม่ได้ระบุอย่างชัดเจนว่าการสั่งซื้อจะได้รับการดูแลรักษา แต่ฉันไม่สามารถเห็นได้ว่าเหตุใดจึงไม่เป็นเช่นนั้น
การแข่งขัน Lightness ใน Orbit

16
ใช่การสั่งซื้อได้รับการดูแลอย่างแน่นอน จะเป็นฟังก์ชั่นที่น่ากลัวถ้ามันสั่งใหม่! :)
webbiedave

1
@webbiedave ขออภัย แต่นั่นไม่เป็นความจริง จริง ๆ แล้วมันเรียงลำดับอาร์เรย์ของฉันใหม่ แปลกมาก ๆ
FooBar

4
เสมอไปสำหรับการแก้กระชับง่าย :)
บรูซลิม

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


13

ใช้array_spliceแทนunset:

$array = array(1,2,3,4,5);
foreach($array as $i => $info)
{
  if($info == 1 || $info == 2)
  {
    array_splice($array, $i, 1);
  }
}

print_r($array);

การทำงานของกลุ่มตัวอย่างที่นี่


7
สิ่งนี้ไม่ทำงาน ตัวต่อจะยอดเยี่ยม แต่คุณไม่สามารถใช้มันใน a for / foreach loop ได้เพราะมันจะจัดเรียง index ใหม่ทุกครั้งที่คุณเรียกมันดังนั้น index ของ foreach loop ไม่ได้ชี้ไปที่องค์ประกอบถัดไป แต่ไปที่ element ที่ตำแหน่งนั้น บนอาร์เรย์ที่จัดเรียงใหม่ คุณสามารถดูได้ในตัวอย่างที่คุณกำลังลบค่า '3' และปล่อยให้ค่า '2' เมื่อคุณควรลบเฉพาะค่า '1' และ '2'
NotGaeL

1
@elcodedocle จากนั้นอย่าใช้การforeachวนซ้ำ ใช้มาตรฐานi Loopและเพียงแค่รีเซ็ต i หลังจากประกบกัน นอกจากนี้ยังWorking sample here.ไม่ทำงาน
SpYk3HH

ลิงก์เสียคุณสามารถแก้ไขได้หรือไม่
Michel Ayres

5

เพียงแค่สารเติมแต่ง

ฉันรู้ว่ามันเก่าแต่ฉันต้องการเพิ่มโซลูชันฉันไม่เห็นว่าฉันมากับตัวเอง พบคำถามนี้ในขณะที่กำลังค้นหาทางออกที่แตกต่างและเพิ่งจะคิดว่า "เอ่อขณะที่ฉันอยู่ที่นี่"

ก่อนอื่นคำตอบของนีลนั้นดีและยอดเยี่ยมหลังจากใช้ลูปของคุณไปแล้ว แต่ฉันต้องการทำงานทั้งหมดในคราวเดียว แน่นอนในกรณีเฉพาะของฉันที่ฉันต้องทำมากขึ้นการทำงานกว่านี้ตัวอย่างง่ายๆที่นี่ แต่วิธีการที่ยังคงใช้ ฉันเห็นสถานที่ที่คนอื่นสองสามคนแนะนำforeachลูปอย่างไรก็ตามสิ่งนี้ยังทำให้คุณเลิกงานเนื่องจากธรรมชาติของสัตว์ร้าย โดยปกติแล้วฉันแนะนำสิ่งต่าง ๆ ที่เรียบง่ายเช่นforeachอย่างไรก็ตามในกรณีนี้เป็นการดีที่สุดที่จะจำfor loopตรรกะแบบเก่าที่ดี เพียงใช้i! เพื่อรักษาดัชนีที่เหมาะสมเพียงลบออกiหลังจากการลบรายการ Array แต่ละครั้ง

นี่คือตัวอย่างการทำงานที่เรียบง่ายของฉัน:

$array = array(1,2,3,4,5);

for ($i = 0; $i < count($array); $i++) {
    if($array[$i] == 1 || $array[$i] == 2) {
        array_splice($array, $i, 1);
        $i--;
    }
}

จะส่งออก:

array(3) {
    [0]=> int(3)
    [1]=> int(4)
    [2]=> int(5)
}

สิ่งนี้สามารถมีการใช้งานง่าย ๆ มากมาย ตัวอย่างเช่นกรณีที่แน่นอนของฉันต้องถือรายการล่าสุดในอาร์เรย์ตามค่าหลายมิติ ฉันจะแสดงสิ่งที่ฉันหมายถึง:

$files = array(
    array(
        'name' => 'example.zip',
        'size' => '100000000',
        'type' => 'application/x-zip-compressed',
        'url' => '28188b90db990f5c5f75eb960a643b96/example.zip',
        'deleteUrl' => 'server/php/?file=example.zip',
        'deleteType' => 'DELETE'
    ),
    array(
        'name' => 'example.zip',
        'size' => '10726556',
        'type' => 'application/x-zip-compressed',
        'url' => '28188b90db990f5c5f75eb960a643b96/example.zip',
        'deleteUrl' => 'server/php/?file=example.zip',
        'deleteType' => 'DELETE'
    ),
    array(
        'name' => 'example.zip',
        'size' => '110726556',
        'type' => 'application/x-zip-compressed',
        'deleteUrl' => 'server/php/?file=example.zip',
        'deleteType' => 'DELETE'
    ),
    array(
        'name' => 'example2.zip',
        'size' => '12356556',
        'type' => 'application/x-zip-compressed',
        'url' => '28188b90db990f5c5f75eb960a643b96/example2.zip',
        'deleteUrl' => 'server/php/?file=example2.zip',
        'deleteType' => 'DELETE'
    )
);

for ($i = 0; $i < count($files); $i++) {
    if ($i > 0) {
        if (is_array($files[$i-1])) {
            if (!key_exists('name', array_diff($files[$i], $files[$i-1]))) {
                if (!key_exists('url', $files[$i]) && key_exists('url', $files[$i-1])) $files[$i]['url'] = $files[$i-1]['url'];
                $i--;
                array_splice($files, $i, 1);
            }
        }
    }
}

จะส่งออก:

array(1) {
    [0]=> array(6) {
            ["name"]=> string(11) "example.zip"
            ["size"]=> string(9) "110726556"
            ["type"]=> string(28) "application/x-zip-compressed"
            ["deleteUrl"]=> string(28) "server/php/?file=example.zip"
            ["deleteType"]=> string(6) "DELETE"
            ["url"]=> string(44) "28188b90db990f5c5f75eb960a643b96/example.zip"
        }
    [1]=> array(6) {
            ["name"]=> string(11) "example2.zip"
            ["size"]=> string(9) "12356556"
            ["type"]=> string(28) "application/x-zip-compressed"
            ["deleteUrl"]=> string(28) "server/php/?file=example2.zip"
            ["deleteType"]=> string(6) "DELETE"
            ["url"]=> string(45) "28188b90db990f5c5f75eb960a643b96/example2.zip"
        }
}

อย่างที่คุณเห็นฉันจัดการ $ i ก่อนต่อด้วยการประกบกันขณะที่ฉันกำลังค้นหาที่จะลบก่อนหน้าแทนที่จะเป็นรายการปัจจุบัน


1

ตอบช้า แต่หลังจาก PHP 5.3 อาจเป็นเช่นนั้น

$array = array(1, 2, 3, 4, 5);
$array = array_values(array_filter($array, function($v) {
    return !($v == 1 || $v == 2);
}));
print_r($array);

1

หรือคุณสามารถสร้างฟังก์ชั่นของคุณเองที่ส่งผ่านอาร์เรย์โดยการอ้างอิง

function array_unset($unsets, &$array) {
  foreach ($array as $key => $value) {
    foreach ($unsets as $unset) {
      if ($value == $unset) {
        unset($array[$key]);
        break;
      }
    }
  }
  $array = array_values($array);
}

ดังนั้นสิ่งที่คุณต้องทำคือ ...

$unsets = array(1,2);
array_unset($unsets, $array);

... และตอนนี้คุณ$arrayไม่มีค่าที่คุณวางไว้$unsetsและกุญแจจะถูกรีเซ็ต


1

100% ทำงานให้ฉัน! หลังจากยกเลิกการตั้งค่าองค์ประกอบในอาร์เรย์คุณสามารถใช้สิ่งนี้เพื่อทำดัชนีอาร์เรย์อีกครั้ง

$result=array_combine(range(1, count($your_array)), array_values($your_array));


-2

ในสถานการณ์ของฉันฉันต้องเก็บคีย์ที่ไม่ซ้ำกับค่าอาเรย์ดังนั้นฉันจึงใช้อาเรย์ที่สอง:

$arr1 = array("alpha"=>"bravo","charlie"=>"delta","echo"=>"foxtrot");
unset($arr1);

$arr2 = array();
foreach($arr1 as $key=>$value) $arr2[$key] = $value;
$arr1 = $arr2
unset($arr2);

1) คุณunset($arr1)ซึ่งจะทำให้ไม่สามารถวนซ้ำในวงวนของคุณได้ 2) คุณขาดเครื่องหมายอัฒภาคในบรรทัดที่สองถึงบรรทัดสุดท้าย ข้อมูลโค้ดนี้จะไม่ทำงาน
Rockin4Life33
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.