Dopo array_filter(), come posso reimpostare i tasti per andare in ordine numerico a partire da 0

StackOverflow https://stackoverflow.com/questions/3401850

  •  25-09-2019
  •  | 
  •  

Domanda

Ho appena usato array_filter per rimuovere le voci che avevano solo il valore '' da un array e ora voglio applicarvi alcune trasformazioni a seconda del segnaposto a partire da 0, ma sfortunatamente mantiene ancora l'indice originale.Ho guardato per un po' e non sono riuscito a vedere niente, forse mi è sfuggito solo l'ovvio, ma la mia domanda è...

Come posso reimpostare facilmente gli indici dell'array per iniziare da 0 e andare in ordine nel NUOVO array, anziché mantenere i vecchi indici?

È stato utile?

Soluzione

Se si chiama array_values sul vostro array, lo farà essere indicizzato da zero.

Altri suggerimenti

Se si utilizza il filtro Array farlo nel modo seguente

$NewArray = array_values(array_filter($OldArray));

Usa array_values():

<?php

$array = array('foo', 'bar', 'baz');
$array = array_filter($array, function ($var) {
    return $var !== 'bar';
});

print_r($array); // indexes 0 and 2
print_r(array_values($array)); // indexes 0 and 1

Mi preoccupo di quanti programmatori abbiano copiato/incollato innocentemente il file array_values(array_filter()) metodo nei loro codici -- Mi chiedo quanti programmatori abbiano involontariamente incontrato problemi a causa dell'avidità di array_filter.O peggio, quante persone non hanno mai scoperto che la funzione elimina troppi valori dall'array...

Presenterò un'alternativa migliore per il processo di stripping in due parti NULL elementi da un array e reindicizzare le chiavi.

Tuttavia, in primo luogo, è estremamente importante sottolineare la natura avida di array_filter() e come questo possa rovinare silenziosamente il tuo progetto.Ecco un array con valori misti che esporrà il problema:

$array=['foo',NULL,'bar',0,false,null,'0',''];

I valori null verranno rimossi indipendentemente dal carattere maiuscolo/minuscolo.

Ma guarda cosa rimane nell'array quando utilizziamo valori_array() & array_filtro():

array_values(array_filter($array));

Matrice di output ($array):

array (
  0 => 'foo',
  1 => 'bar'
)
// All empty, zero-ish, falsey values were removed too!!!

Ora guarda cosa ottieni con il mio metodo che utilizza array_walk() & è zero() per generare un nuovo array filtrato:

array_walk($array,function($v)use(&$filtered){if(!is_null($v)){$filtered[]=$v;}});

Questo può essere scritto su più righe per facilitare la lettura/spiegazione:

array_walk(                      // iterate each element of an input array
    $array,                      // this is the input array
    function($v)use(&$filtered){ // $v is each value, $filter (output) is declared/modifiable
        if(!is_null($v)){        // this literally checks for null values
            $filtered[]=$v;      // value is pushed into output with new indexes
        }
    }
);

Array di output ($filtro):

array (
  0 => 'foo',
  1 => 'bar',
  2 => 0,
  3 => false,
  4 => '0',
  5 => '',
)

Con il mio metodo ottieni le chiavi reindicizzate, tutti i valori non nulli e nessuno dei valori nulli.Un one-liner pulito, portatile e affidabile per tutte le esigenze di filtraggio nullo dell'array.Ecco un dimostrazione.



Allo stesso modo, se desideri rimuovere elementi vuoti, falsi e nulli (mantenendo gli zeri), funzioneranno questi quattro metodi:

var_export(array_values(array_diff($array,[''])));

O

var_export(array_values(array_diff($array,[null])));

O

var_export(array_values(array_diff($array,[false])));

O

var_export(array_values(array_filter($array,'strlen')));

Produzione:

array (
  0 => 'foo',
  1 => 'bar',
  2 => 0,
  3 => '0',
)

Infine, per chiunque preferisca la sintassi dei costrutti del linguaggio, è anche possibile semplicemente inserire valori qualificanti in un nuovo array per emettere nuovi indici.

$array=['foo', NULL, 'bar', 0, false, null, '0', ''];

$result = [];
foreach ($array as $value) {
    if (strlen($value)) {
        $result[] = $value;
    }
}

var_export($result);
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top