Rebase kunci array setelah elemen tidak disetel

183

Saya memiliki sebuah array:

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

Jika saya membuang konten array mereka akan terlihat seperti ini:

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

Ketika saya mengulang-ulang dan menghapus kunci tertentu, indeks akan didongkrak.

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

Selanjutnya, jika saya melakukan dump lain sekarang akan terlihat seperti:

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

Apakah ada cara yang tepat untuk mengatur ulang array sehingga elemen-elemennya berbasis Zero lagi ??

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

Jawaban:

411

Coba ini:

$array = array_values($array);

Menggunakan array_values ​​()

Naftali alias Neal
sumber
6
+1. Saya perhatikan bahwa manual ini tidak secara eksplisit menyatakan bahwa pemesanan akan dipertahankan, tetapi saya tidak dapat melihat mengapa tidak.
Lightness Races in Orbit
16
Ya, pemesanan pasti dipertahankan. Akan menjadi fungsi yang mengerikan jika dipesan ulang itu! :)
webbiedave
1
@ webbiedelah minta maaf, tapi itu tidak benar. Sebenarnya mengatur ulang array saya. Sangat sangat aneh.
FooBar
4
selalu mencari solusi ringkas yang mudah :)
Bruce Lim
1
Meskipun ini adalah solusi mudah ketika array sudah diberi nomor, itu tidak berfungsi ketika kunci ditetapkan sebagai teks, seperti itu akan menjadi bagian dari formulir HTML. Jika Anda mengandalkan nilai kunci unik untuk mengidentifikasi output dari formulir, salah satu metode di bawah ini berfungsi lebih baik.
17

Dapatkan metode lain yang menarik:

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

$array = array_merge($array); 

Sekarang kunci $ array disetel ulang.

Web_Developer
sumber
13

Gunakan array_splicedaripada 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);

Sampel kerja di sini .

Demian Brecht
sumber
7
Ini tidak bekerja. splice akan luar biasa tetapi Anda tidak dapat menggunakannya di dalam for / foreach loop karena mengatur ulang indeks setiap kali Anda menyebutnya, sehingga indeks foreach loop tidak menunjuk ke elemen berikutnya tetapi ke elemen dengan posisi itu pada array yang disusun ulang. Anda dapat melihat dalam contoh Anda, Anda menghapus nilai '3' dan meninggalkan nilai '2' ketika Anda harus menghapus hanya nilai '1' dan '2'
NotGaeL
1
@elcodedocle Maka jangan gunakan foreachloop. Gunakan standar i Loopdan cukup mengatur ulang saya setelah sambungan. Juga, Working sample here.tidak berfungsi.
SpYk3HH
Tautan rusak, bisakah Anda memperbaikinya?
Michel Ayres
5

Hanya sebuah aditif.

Saya tahu ini sudah tua , tetapi saya ingin menambahkan solusi. Saya tidak melihat bahwa saya datang dengan diri saya sendiri. Menemukan pertanyaan ini saat mencari solusi yang berbeda dan hanya berpikir, "Yah, selagi aku di sini."

Pertama-tama, jawaban Neal bagus dan bagus untuk digunakan setelah Anda menjalankan loop Anda, namun, saya lebih suka melakukan semua pekerjaan sekaligus. Tentu saja, dalam kasus khusus saya, saya harus melakukan lebih banyak pekerjaan daripada contoh sederhana ini di sini, tetapi metode ini masih berlaku. Saya melihat di mana pasangan lain menyarankan foreachloop, namun, ini masih menyisakan Anda setelah bekerja karena sifat binatang itu. Biasanya saya menyarankan hal-hal sederhana seperti foreach, bagaimanapun, dalam hal ini, yang terbaik adalah mengingat for looplogika kuno yang baik . Cukup gunakan i! Untuk mempertahankan indeks yang sesuai, cukup kurangi isetelah setiap penghapusan item Array.

Inilah contoh sederhana dan berfungsi :

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

Akan menghasilkan:

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

Ini dapat memiliki banyak implementasi sederhana. Sebagai contoh, kasus persis saya membutuhkan penyimpanan item terbaru dalam array berdasarkan nilai multidimensi. Saya akan menunjukkan kepada Anda apa yang saya maksud:

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

Akan menghasilkan:

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

Seperti yang Anda lihat, saya memanipulasi $ i sebelum sambungan karena saya ingin menghapus item sebelumnya, bukan item yang sekarang.

SpYk3HH
sumber
1

Tetapi terlambat menjawab, setelah PHP 5.3 bisa jadi;

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

Atau Anda dapat membuat fungsi Anda sendiri yang melewati array dengan referensi.

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

Jadi yang harus Anda lakukan adalah ...

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

... dan sekarang Anda $arraytanpa nilai yang Anda tempatkan $unsetsdan kunci diatur ulang

penuh
sumber
1

100% bekerja untuk saya! Setelah elemen yang tidak disetel dalam array Anda dapat menggunakan ini untuk mengindeks ulang array

$result=array_combine(range(1, count($your_array)), array_values($your_array));
Atta Ur Rehman
sumber
0

Saya gunakan $arr = array_merge($arr); untuk membuat ulang array. Sederhana dan mudah.

Rockin4Life33
sumber
-2

Dalam situasi saya, saya perlu mempertahankan kunci unik dengan nilai-nilai array, jadi saya hanya menggunakan array kedua:

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

$arr2 = array();
foreach($arr1 as $key=>$value) $arr2[$key] = $value;
$arr1 = $arr2
unset($arr2);
John K.
sumber
1) Anda unset($arr1)yang akan membuatnya TIDAK tersedia untuk beralih lagi di loop Anda. 2) Anda kehilangan titik koma pada baris kedua hingga terakhir. Cuplikan kode ini tidak akan berjalan.
Rockin4Life33