php

Przebuduj klucze tablicy po zresetowaniu elementów


Mam tablicę:
$array = array(1,2,3,4,5);

Gdybym zrzucił zawartość tablicy, wyglądałyby tak:
array(5) {
[0] => int(1)
[1] => int(2)
[2] => int(3)
[3] => int(4)
[4] => int(5)
}

Kiedy iteruję i zrzucam określone klucze, indeks rośnie.
foreach($array as $i => $info)
{
if($info == 1 || $info == 2)
{
unset($array[$i]);
}
}

Następnie, gdybym miał teraz wykonać kolejny zrzut, wyglądałoby to tak:
array(3) {
[2] => int(3)
[3] => int(4)
[4] => int(5)
}

Czy istnieje poprawny sposób zresetowania tablicy tak, aby jej elementy były ponownie zerowe?
array(3) {
[0] => int(3)
[1] => int(4)
[2] => int(5)
}

Zaproszony:
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Spróbuj:
$array = array_values($array);

Za pomocą

array_values()
http://php.net/manual/en/function.array-values.php
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Jest jeszcze jedna ciekawa metoda:
$array = array('a', 'b', 'c', 'd'); 
unset($array[2]); $array = array_merge($array);

Klucze $ array zostały teraz wyczyszczone.
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Użyj
array_splice
zamiast
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);


Próbka robocza tutaj

http://ideone.com/liyoh
.
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:


Tylko dodatek.
>
Wiem co to jest


stary
ale chciałem dodać rozwiązanie, którego sam nie widzę. Znalazłem to pytanie podczas szukania innego rozwiązania i właśnie sobie uświadomiłem: „Cóż, póki tu jestem”.
Najpierw odpowiedź

Nil
https://coderoad.ru/5943149/
ładny i świetny w użyciu po uruchomieniu pętli, jednak wolałbym wykonać całą pracę na raz. Oczywiście w moim przypadku musiałem to zrobić

jeszcze

działa niż ten prosty przykład tutaj, ale metoda nadal ma zastosowanie. Widziałem, gdzie kilka innych osób zasugerowało pętle
foreach
, ale to nadal Cię opuszcza

po pracy

ze względu na naturę bestii. Zwykle sugeruję prostsze rzeczy, takie jak
foreach
, ale w tym przypadku najlepiej jest zapamiętać dobrą, starą logikę
for loop
. Po prostu użyj
i

! Aby zachować odpowiedni indeks, po każdym usunięciu elementu tablicy odejmij od
i
.
Oto mój prosty,


pracujący
przykład:
$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--;
}
}

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

Może to mieć wiele prostych implementacji. Na przykład mój dokładny przypadek wymagał przechowywania ostatniego elementu w tablicy opartej na wartościach wielowymiarowych. Pokażę ci, co mam na myśli.:
$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);
}
}
}
}

Wyświetli:
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"
}
}

Jak widać, manipuluję $ i przed splataniem, ponieważ próbuję usunąć poprzedni element, a nie bieżący.
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Możesz też utworzyć własną funkcję, która przekazuje tablicę przez odniesienie.
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);
}

Więc wszystko, co musisz zrobić, to ...
$unsets = array(1,2);
array_unset($unsets, $array);
... a teraz twoja
$ array
nie zawiera wartości, które umieściłeś w
$ unsets
i klucze są resetowane
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Późna odpowiedź, ale po PHP 5.3 może wyglądać tak;
$array = array(1, 2, 3, 4, 5);
$array = array_values(array_filter($array, function($v) {
return !($v == 1 || $v == 2);
}));
print_r($array);
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

100% działa na mnie! Po usunięciu elementów z tablicy możesz użyć tego do ponownego indeksowania tablicy
$result=array_combine(range(1, count($your_array)), array_values($your_array));
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Używam
$ arr = array_merge ($ arr);
, aby zmienić bazę tablicy. Proste i zrozumiałe.
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

W mojej sytuacji potrzebowałem przechowywać unikalne klucze z wartościami tablicowymi, więc użyłem tylko drugiej tablicy:
$arr1 = array("alpha"=>"bravo","charlie"=>"delta","echo"=>"foxtrot");
unset($arr1);$arr2 = array();
foreach($arr1 as $key=>$value) $arr2[$key] = $value;
$arr1 = $arr2
unset($arr2);

Aby odpowiedzieć na pytania, Zaloguj się lub Zarejestruj się