Rebase các khóa mảng sau khi bỏ đặt các phần tử


183

Tôi có một mảng:

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

Nếu tôi bỏ nội dung của mảng thì chúng sẽ trông như thế này:

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

Khi tôi lặp qua và bỏ đặt một số khóa nhất định, chỉ mục sẽ được kích hoạt.

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

Sau đó, nếu tôi thực hiện một bãi chứa khác bây giờ, nó sẽ trông như sau:

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

Có cách nào thích hợp để thiết lập lại mảng để các phần tử của nó được dựa trên Zero không ??

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

Câu trả lời:


411

Thử cái này:

$array = array_values($array);

Sử dụng mảng_values ​​()


6
+1. Tôi lưu ý rằng hướng dẫn không nói rõ rằng việc đặt hàng sẽ được duy trì, nhưng tôi không thể hiểu tại sao nó lại như vậy.
Các cuộc đua nhẹ nhàng trong quỹ đạo

16
Có, đặt hàng chắc chắn được duy trì. Sẽ là một chức năng gớm ghiếc nếu nó sắp xếp lại nó! :)
webbiedave

1
@webbiedave xin lỗi, nhưng điều đó không đúng. Nó thực sự sắp xếp lại mảng của tôi. Rất rất lạ.
FooBar

4
luôn luôn tìm kiếm các giải pháp ngắn gọn dễ dàng :)
Bruce Lim

1
Mặc dù đây là một giải pháp dễ dàng khi mảng đã được đánh số, nhưng nó không hoạt động khi khóa được đặt dưới dạng văn bản, giống như nó là một phần của biểu mẫu HTML. Nếu bạn đang dựa vào các giá trị khóa duy nhất để xác định đầu ra từ một biểu mẫu, một trong những phương pháp dưới đây hoạt động tốt hơn.

17

Có một phương pháp thú vị khác:

$array = array('a', 'b', 'c', 'd'); 
unset($array[2]); 

$array = array_merge($array); 

Bây giờ các khóa mảng $ được đặt lại.


13

Sử dụng array_splicechứ không phải 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);

Mẫu làm việc ở đây .


7
Đây không phải là làm việc. splice sẽ rất tuyệt nhưng bạn không thể sử dụng nó trong vòng lặp for / foreach vì nó sắp xếp lại chỉ mục mỗi khi bạn gọi nó, vì vậy chỉ mục của vòng lặp foreach không trỏ đến phần tử tiếp theo mà là phần tử có vị trí đó trên mảng sắp xếp lại. Bạn có thể thấy trong ví dụ bạn đang xóa giá trị '3' và để lại giá trị '2' khi bạn chỉ nên xóa các giá trị '1' và '2'
NotGaeL

1
@elcodingocle Sau đó, không sử dụng foreachvòng lặp. Sử dụng tiêu chuẩn i Loopvà chỉ cần đặt lại i sau một mối nối. Ngoài ra, Working sample here.không hoạt động.
SpYk3HH

Liên kết bị hỏng, bạn có thể sửa nó?
Michel Ayres

5

Chỉ là một phụ gia.

Tôi biết điều này đã , nhưng tôi muốn thêm một giải pháp mà tôi không thấy rằng tôi đã tự mình nghĩ ra. Tìm thấy câu hỏi này trong khi tìm kiếm một giải pháp khác và chỉ cần tìm, "Chà, trong khi tôi ở đây."

Trước hết, câu trả lời của Neal rất hay và tuyệt vời để sử dụng sau khi bạn chạy vòng lặp của mình, tuy nhiên, tôi thích làm tất cả công việc cùng một lúc. Tất nhiên, trong trường hợp cụ thể của tôi, tôi đã phải làm nhiều công việc hơn ví dụ đơn giản này ở đây, nhưng phương pháp vẫn được áp dụng. Tôi đã thấy nơi một vài người khác đề nghị foreachcác vòng lặp, tuy nhiên, điều này vẫn để lại cho bạn sau khi làm việc do bản chất của con thú. Thông thường tôi đề nghị những điều đơn giản hơn foreach, tuy nhiên, trong trường hợp này, tốt nhất bạn nên nhớ for looplogic lỗi thời . Đơn giản chỉ cần sử dụng i! Để duy trì chỉ số thích hợp, chỉ cần trừ đi isau mỗi lần xóa một mục Array.

Đây là ví dụ đơn giản, hiệu quả của tôi :

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

Sẽ xuất:

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

Điều này có thể có nhiều thực hiện đơn giản. Ví dụ, trường hợp chính xác của tôi yêu cầu giữ vật phẩm mới nhất trong mảng dựa trên các giá trị đa chiều. Tôi sẽ cho bạn thấy ý của tôi là:

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

Sẽ xuất:

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

Như bạn thấy, tôi thao túng $ i trước mối nối khi tôi đang tìm cách loại bỏ mục trước đó, thay vì mục hiện tại.


1

Trả lời muộn nhưng, sau PHP 5.3 có thể là như vậy;

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

1

Hoặc bạn có thể tạo hàm riêng của mình vượt qua mảng bằng tham chiếu.

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

Vì vậy, tất cả những gì bạn phải làm là ...

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

... và bây giờ bạn $arraykhông có các giá trị bạn đặt $unsetsvà các phím được đặt lại


1

100% làm việc cho tôi! Sau khi bỏ đặt các phần tử trong mảng, bạn có thể sử dụng phần tử này để lập chỉ mục lại mảng

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

0

Tôi sử dụng $arr = array_merge($arr); để rebase một mảng. Đơn giản và dễ hiểu.


-2

Trong tình huống của tôi, tôi cần giữ lại các khóa duy nhất với các giá trị mảng, vì vậy tôi chỉ sử dụng một mảng thứ hai:

$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) Bạn unset($arr1)sẽ làm cho nó KHÔNG có sẵn để lặp đi lặp lại trong vòng lặp của bạn. 2) Bạn đang thiếu dấu chấm phẩy ở dòng thứ hai đến dòng cuối cùng. Đoạn mã này sẽ không chạy.
Rockin4Life33
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.