Sostituisci le chiavi dell'array dopo aver disattivato gli elementi


183

Ho un array:

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

Se dovessi scaricare il contenuto dell'array apparirebbero così:

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

Quando eseguo il ciclo continuo e deseleziono determinati tasti, l'indice viene sollevato.

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

Successivamente, se avessi fatto un'altra discarica ora sarebbe simile a:

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

Esiste un modo corretto per ripristinare l'array in modo che i suoi elementi siano di nuovo basati su Zero ??

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

Risposte:


411

Prova questo:

$array = array_values($array);

Utilizzo di array_values ​​()


6
+1. Prendo atto che il manuale non afferma esplicitamente che l'ordine verrà gestito, ma non riesco a capire perché non lo sia.
Razze di leggerezza in orbita

16
Sì, l'ordinamento è sicuramente mantenuto. Sarebbe una funzione orribile se la riordinasse! :)
webbiedave

1
@webbiedave scusa, ma non è vero. In realtà riordina il mio array. Molto molto strano
FooBar,

4
scegli sempre soluzioni facili e concise :)
Bruce Lim,

1
Sebbene questa sia una soluzione semplice quando l'array è già numerato, non funziona quando la chiave è impostata come testo, come se fosse parte di un modulo HTML. Se si fa affidamento su valori chiave univoci per identificare l'output di un modulo, uno dei metodi seguenti funziona meglio.

17

Hai un altro metodo interessante:

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

$array = array_merge($array); 

Ora le chiavi $ array vengono ripristinate.


13

Usa array_splicepiuttosto che 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);

Campione di lavoro qui .


7
Questo non funziona. la giunzione sarebbe fantastica ma non puoi usarla all'interno di un ciclo for / foreach perché riorganizza l'indice ogni volta che lo chiami, quindi l'indice del ciclo foreach non punta all'elemento successivo ma all'elemento con quella posizione sull'array riorganizzato. Puoi vedere nel tuo esempio che stai eliminando il valore '3' e lasciando il valore '2' quando dovresti eliminare solo i valori '1' e '2'
NotGaeL

1
@elcodedocle Quindi non usare un foreachloop. Utilizzare lo standard i Loope reimpostare semplicemente i dopo una giunzione. Inoltre, Working sample here.non funziona.
SpYk3HH,

Link interrotto, potresti risolverlo?
Michel Ayres,

5

Solo un additivo.

So che questo è vecchio , ma volevo aggiungere una soluzione e non vedo che mi sono inventato. Ho trovato questa domanda mentre cercavo una soluzione diversa e ho appena pensato: "Bene, mentre sono qui".

Prima di tutto, la risposta di Neal è buona e ottima da usare dopo aver eseguito il ciclo, tuttavia, preferirei fare tutto il lavoro in una volta. Certo, nel mio caso specifico ho dovuto fare più lavoro di questo semplice esempio qui, ma il metodo si applica ancora. Ho visto dove un paio di altri hanno suggerito dei foreachloop, tuttavia, questo ti lascia ancora dopo il lavoro a causa della natura della bestia. Normalmente suggerisco cose più semplici come foreach, tuttavia, in questo caso, è meglio ricordare la buona for looplogica vecchio stile . Basta usare i! Per mantenere un indice appropriato, sottraete semplicemente idopo ogni rimozione di un elemento Array.

Ecco il mio esempio semplice e funzionante :

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

Uscita:

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

Questo può avere molte semplici implementazioni. Ad esempio, il mio caso esatto ha richiesto la conservazione dell'ultimo elemento nell'array in base a valori multidimensionali. Ti mostrerò cosa intendo:

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

Uscita:

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

Come vedi, manipolo $ i prima della giunzione mentre cerco di rimuovere l'elemento precedente, anziché l'elemento attuale.


1

Risposta in ritardo ma, dopo PHP 5.3 potrebbe essere così;

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

1

Oppure puoi creare la tua funzione che passa l'array per riferimento.

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

Quindi tutto ciò che devi fare è ...

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

... e ora il tuo $arrayè senza i valori inseriti $unsetse le chiavi vengono ripristinate


1

100% di lavoro per me! Dopo aver disattivato gli elementi nell'array, è possibile utilizzarlo per reindicizzare l'array

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


-2

Nella mia situazione, avevo bisogno di conservare chiavi univoche con i valori dell'array, quindi ho usato solo un secondo array:

$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) Tu unset($arr1)che non lo renderai disponibile per iterare nel tuo loop. 2) Ti manca il punto e virgola nella penultima riga. Questo frammento di codice non verrà eseguito.
Rockin4Life33
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.