Po array filter(), jak Mogę zresetować klawisze, aby przejść w porządku liczbowym od 0

Użyłem array_filter do usunięcia wpisów, które miały tylko wartość " z tablicy, a teraz chcę zastosować pewne przekształcenia w zależności od elementu zastępczego zaczynając od 0, ale niestety nadal zachowuje oryginalny indeks. Szukałem przez chwilę i nic nie mogłem zobaczyć, może po prostu przegapiłem oczywiste, ale moje pytanie jest...

Jak mogę łatwo zresetować indeksy tablicy, aby zaczynały się od 0 i szły w kolejności w nowej tablicy, a nie żeby zachowywała starą indeksy?

Author: mickmackusa, 2010-08-04

4 answers

Jeśli zadzwonisz array_values na twojej tablicy, będzie ona reindeksowana od zera.

 155
Author: Daniel Vandersluis,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-08-04 00:59:56

Jeśli używasz filtra tablicy zrób to w następujący sposób

$NewArray = array_values(array_filter($OldArray));
 18
Author: user2182143,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-12-25 16:17:11

Martwię się, ilu programistów niewinnie skopiowało / wkleiło metodę array_values(array_filter()) do swoich kodów -- zastanawiam się, ilu programistów nieświadomie napotkało problemy z powodu chciwości array_filter. Albo, co gorsza, jak wiele osób nigdy nie odkryło, że funkcja usuwa zbyt wiele wartości z tablicy...

Przedstawię lepszą alternatywę dla dwuczęściowego procesu usuwania NULL elementów z tablicy i ponownego indeksowania kluczy.

Jednak po pierwsze, jest niezwykle ważne, że podkreślam chciwość array_filter() i jak to może po cichu zamanifestować Twój projekt. Oto tablica z wartościami mieszanymi, która ujawni problem:

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

Wartości Null zostaną usunięte niezależnie od wielkich / małych liter.

Ale spójrz na to, co pozostaje w tablicy, gdy używamy wartości array_() & array_filter():

array_values(array_filter($array));

Output array ($array):

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

A teraz spójrz co dostajesz z mojej metody, która używa array_walk() & is_null () do wygenerowania nowej filtrowanej tablicy:

array_walk($array,function($v)use(&$filtered){if(!is_null($v)){$filtered[]=$v;}});
Można to zapisać w wielu wierszach dla łatwiejszego czytania/wyjaśniania:
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
        }
    }
);

Output array ($filter):

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

Z moją metodą otrzymujesz ponownie indeksowane klucze, wszystkie wartości inne niż null i żadna z wartości null. Czysty, przenośny, niezawodny jednowarstwowy dla wszystkich Twoich potrzeb filtrowania tablicy null. Oto demonstracja .



Podobnie, jeśli chcesz usunąć elementy empty, false I null( zachowując zera), te cztery metody będą działać:

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

Lub

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

Lub

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

Lub

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

Wyjście:

array (
  0 => 'foo',
  1 => 'bar',
  2 => 0,
  3 => '0',
)
 8
Author: mickmackusa,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-07-14 21:33:38

Użycie 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
 7
Author: Ed Mazur,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-08-04 01:08:02