Elemanların ayarını kaldırdıktan sonra dizi anahtarlarını yeniden temel al


183

Bir dizi var:

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

Dizinin içeriğini dökmek olsaydı onlar şöyle görünecekti:

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

Dönüp belirli tuşları ayarladığımda, dizin tüm jacked olur.

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

Daha sonra, şimdi başka bir dökümü yapsaydım şöyle görünecektir:

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

Böylece öğeleri tekrar Sıfır tabanlı dizi sıfırlamak için uygun bir yolu var mı ??

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

Yanıtlar:


411

Bunu dene:

$array = array_values($array);

Array_values ​​() kullanma


6
+1. Kılavuzun, siparişin sürdürüleceğini açıkça belirtmediğini, ancak neden olmayacağını göremiyorum.
Yörüngedeki Hafiflik Yarışları

16
Evet, sipariş kesinlikle korunur. Eğer yeniden sıralarsa iğrenç bir işlev olurdu! :)
webbiedave

1
@webbiedave üzgünüm, ama bu doğru değil. Aslında dizimi yeniden sıralıyor. Çok çok garip.
FooBar

4
her zaman kolay özlü çözümler için gidin :)
Bruce Lim

1
Dizi zaten numaralandırıldığında bu kolay bir çözüm olsa da, anahtar HTML formunun bir parçası gibi metin olarak ayarlandığında işe yaramaz. Bir formdan çıktıyı tanımlamak için benzersiz anahtar değerlerine güveniyorsanız, aşağıdaki yöntemlerden biri daha iyi çalışır.

17

Başka ilginç bir yöntem var:

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

$array = array_merge($array); 

Şimdi $ dizi anahtarları sıfırlandı.


13

Şunun array_spliceyerine kullanın 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);

Burada örnek çalışıyor .


7
Bu çalışmıyor. splice harika olurdu, ancak for / foreach döngüsünün içinde kullanamazsınız çünkü her aradığınızda dizini yeniden düzenler, böylece foreach döngüsünün dizini bir sonraki öğeye değil, bu konuma sahip öğeye işaret eder yeniden düzenlenmiş dizide.
Örneğinizde,

1
@elcodedocle O zaman foreachdöngü kullanmayın . Standardı kullanın i Loopve ekleme işleminden sonra i'yi sıfırlayın. Ayrıca, Working sample here.çalışmıyor.
SpYk3HH

Bozuk bağlantı, düzeltebilir misiniz?
Michel Ayres

5

Sadece bir katkı maddesi.

Bunun eski olduğunu biliyorum , ama kendime geldiğimi görmediğim bir çözüm eklemek istedim. Bu soruyu farklı bir çözüm arayışında buldum ve "Eh, ben buradayken" diye düşündüm.

Her şeyden önce, Neal'ın cevabı , döngünüzü çalıştırdıktan sonra kullanmak iyi ve harika, ancak, tüm işleri bir kerede yapmayı tercih ederim. Tabii ki, benim özel durumumda , bu basit örnekten daha fazla iş yapmak zorunda kaldım , ancak yöntem hala geçerli. Birkaç kişinin nerede foreachdöngü önerdiğini gördüm , ancak bu , canavarın doğası nedeniyle işten sonra sizi bırakıyor . Normalde daha basit şeyler öneririm foreach, ancak bu durumda, iyi eski moda for loopmantığı hatırlamak en iyisidir . Sadece kullanın i! Uygun dizini korumak için ibir Dizi öğesinin her kaldırılmasından sonra çıkarmanız yeterlidir .

İşte benim basit, çalışan örneğim:

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

Çıktı olacak:

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

Bunun birçok basit uygulaması olabilir. Örneğin, tam durumum çok boyutlu değerlere dayalı olarak dizideki en son öğenin tutulmasını gerektiriyordu. Ne demek istediğimi göstereceğim:

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

Çıktı olacak:

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

Gördüğünüz gibi, mevcut öğeden ziyade önceki öğeyi kaldırmak istediğimde $ i ek yerine eklemiyorum.


1

Geç cevap ama PHP 5.3'ten sonra böyle olabilir;

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

1

Ya da diziyi referans olarak geçen kendi işlevinizi yapabilirsiniz.

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

O zaman tek yapmanız gereken ...

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

... ve şimdi $arrayyerleştirdiğiniz değerler olmadan $unsetsve tuşlar sıfırlandı


1

% 100 benim için çalışıyor! Dizideki ayarlanmamış öğelerden sonra diziyi yeniden dizine eklemek için bunu kullanabilirsiniz

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

0

Kullandığım $arr = array_merge($arr); bir dizi rebase. Basit ve anlaşılır.


-2

Benim durumumda, ben dizi değerleri ile benzersiz anahtarları tutmak gerekiyordu, bu yüzden sadece ikinci bir dizi kullanılır:

$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)Döngünüzde yinelemeyi uygun hale getirmeyeceksiniz. 2) İkinci satırdan son satıra kadar noktalı virgül eksik. Bu kod pasajı çalışmaz.
Rockin4Life33
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.