Po prostu dodatek.
Wiem, że to stare , ale chciałem dodać rozwiązanie. Nie widzę, że sam wymyśliłem. Znalazłem to pytanie podczas poszukiwania innego rozwiązania i po prostu pomyślałem: „Cóż, póki tu jestem”.
Przede wszystkim odpowiedź Neala jest dobra i świetna do użycia po uruchomieniu pętli, jednak wolę wykonywać całą pracę na raz. Oczywiście w moim konkretnym przypadku musiałem wykonać więcej pracy niż ten prosty przykład tutaj, ale metoda nadal obowiązuje. Widziałem, gdzie kilka innych sugerowało foreach
pętle, jednak nadal pozostawia to po pracy ze względu na naturę bestii. Zwykle sugeruję prostsze rzeczy foreach
, ale w tym przypadku najlepiej pamiętać staroświecką for loop
logikę. Po prostu użyj i
! Aby zachować odpowiedni indeks, po prostu odejmij i
po każdym usunięciu elementu Array.
Oto mój prosty, działają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--;
}
}
Wyjdzie:
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 najnowszego elementu w tablicy na podstawie wartości 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);
}
}
}
}
Wyjdzie:
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 widzisz, manipuluję $ i przed połączeniem, próbując usunąć poprzedni, a nie obecny przedmiot.