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?
4 answers
Jeśli zadzwonisz array_values
na twojej tablicy, będzie ona reindeksowana od zera.
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));
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:
Można to zapisać w wielu wierszach dla łatwiejszego czytania/wyjaśniania:array_walk($array,function($v)use(&$filtered){if(!is_null($v)){$filtered[]=$v;}});
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',
)
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
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