Michał Stachura

Michał Stachura Dedykowane serwisy i
strony www -
http://santri.eu

Temat: Kasowanie rekordów z tablicy

Witam,

mam dwie tablice
$tabliczka = array(1,3,21,1,12);
$offset = array(1,3,5)

$offset definiuje które elementy z $tabliczka mają być usunięte w tym wypadku są to: 1, 21, 12.

Jak to teraz prawidłowo usunąć?
array_splice nie bardzo bo jak zrobiłem:
foreach ($offset as $i) {
array_splice ($tabliczka, $i, 1);
}

jak mozecie się domyślić w pierwszym przebiegu wyciął 1 tak jak trzeba ale przy okazji aktualizował sobie offseta i w kolejnym zamiast usunąć 21 wyciął 1.

Na okrętke to wiem jak to napisać zamienić na stringa, sparsować, zrobić ponownie tablicę ale coś mi świta, że można to po normalnemu zrobić tylko... no właśnie jasność pomroczna.Michał Stachura edytował(a) ten post dnia 10.12.09 o godzinie 23:41

konto usunięte

Temat: Kasowanie rekordów z tablicy

możesz posortować $offset malejąco
Marcin B.

Marcin B. Webdirector,
Wspólwłasciciel
Contip.net

Temat: Kasowanie rekordów z tablicy

A jak "pojedziesz" od końca, to nie będzie lepiej?
for($i=count($offset)-1; $i>=0; $i--) {
array_splice($tabliczka, $offset[$i], 1);
}


Pisane z głowy, więc może coś tam literówka nie trybić. Rozwiązanie to działa przy założeniu, że masz offsety rosnąco (tak jak w przykładzie).

Propozycja Mateusza z rsort($offset) jest lepsza.Marcin Busza edytował(a) ten post dnia 10.12.09 o godzinie 23:53
Marcin Lejman

Marcin Lejman Właściciel, iTrans

Temat: Kasowanie rekordów z tablicy

Michał Stachura:
Jak to teraz prawidłowo usunąć?
array_splice nie bardzo bo jak zrobiłem:

Ja tam wielkim programistą nie jestem, ale jakbyś zrobił tak, to może by działało zgodnie z oczekiwaniami?


$zmniejsz_offset = 0;
foreach ($offset as $i) {
array_splice ($tabliczka, $i-$zmniejsz_offset, 1);
$zmniejsz_offset++;
}
Marcin Lejman edytował(a) ten post dnia 10.12.09 o godzinie 23:57
Michał Stachura

Michał Stachura Dedykowane serwisy i
strony www -
http://santri.eu

Temat: Kasowanie rekordów z tablicy

No mówiłem - jasność pomroczna :)

Sortowanie $offset malejąco rozwiązuje problem. Chodzenie 'od końca' też ale sortowanie malejąco to w sumie to to samo.

rsort($offset);
foreach ($offset as $i) {
array_splice ($tabliczka, $i, 1);
}

to rozwiązuje problem. Dzięki wszystkim za uwagi i pomoc.Michał Stachura edytował(a) ten post dnia 11.12.09 o godzinie 00:15
Karol Nowacki

Karol Nowacki Programista PHP,
Perl, C,
administrator
systemów *NIX

Temat: Kasowanie rekordów z tablicy

wywoływać funkcję array_splice tylko po to, aby usunąć jeden element, do tego count($offset) razy? Wolniej się chyba nie dało.

Nie lepiej:
foreach($offset as $i)
unset($tabliczka[$i]);
$tabliczka = array_values($tabliczka);
wyjdzie na to samo, a będzie dużo szybciej.Karol Nowacki edytował(a) ten post dnia 14.12.09 o godzinie 15:02
Michał Stachura

Michał Stachura Dedykowane serwisy i
strony www -
http://santri.eu

Temat: Kasowanie rekordów z tablicy

Karol, nie wiem czy dokładnie przeczytałeś wszystkie posty.
Nikt nie mówi o liczeniu długości $offseta x razy. Nikt tez nie mówi o usuwaniu jednego rekordu.

Twoje rozwiązanie też jest dobre zauważ jednak, że względem ostatecznie wypracowanego rozwiązania niewiele się różni.

po array_splice nie musisz przeładowywać indeksów co musisz wykonac po unset. Liczba operacji jest taka sama w obu przypadkach.

Szybkość ich wykonania... no cóż jak bym miał tabelę z 10000 rekordów może i by mi się chciało przeprowadzić testy, dla mniejszej nie widzę sensu.
Karol Nowacki

Karol Nowacki Programista PHP,
Perl, C,
administrator
systemów *NIX

Temat: Kasowanie rekordów z tablicy

Michał Stachura:
Liczba operacji jest taka sama w obu przypadkach.

Szybkość ich wykonania... no cóż jak bym miał tabelę z 10000 rekordów może i by mi się chciało przeprowadzić testy, dla mniejszej nie widzę sensu.

może "liczba" jest taka sama... ale na pewno nie ich szybkość. unset jest zdecydowanie szybsze. A co do testów, w aplikacjach sieciowych nie trzeba mieć tablicy z 10000 elementów tylko 10000 hitów w stronę.

A co do testów:
[kajoj@shellcode ~]$ php sl.php
Czas wykonania unset: 0.0036478042602539
Czas wykonania arrat_splice: 12.386412143707
[kajoj@shellcode ~]$ cat sl.php
<?php
function getmicrotime() { list ($usec, $sec) = explode(" ", microtime()); return ((float) $usec + (float) $sec); }

$tabliczka = range(1, 10001);
$offset = range(1, 10000);

$start = getmicrotime();
foreach($offset as $o)
unset($tabliczka[$o]);
$tabliczka = array_values($tabliczka);

echo "Czas wykonania unset: ", getmicrotime()-$start, "\n";

$tabliczka = range(1, 10001);
$offset = range(1, 10000);

$start = getmicrotime();
rsort($offset);
foreach ($offset as $i)
array_splice ($tabliczka, $i, 1);
echo "Czas wykonania arrat_splice: ", getmicrotime()-$start, "\n";
[kajoj@shellcode ~]$
Karol Nowacki edytował(a) ten post dnia 14.12.09 o godzinie 16:10
Michał Stachura

Michał Stachura Dedykowane serwisy i
strony www -
http://santri.eu

Temat: Kasowanie rekordów z tablicy

Karol, 1:0 dla Ciebie :). Dość spora różnica, dzięki za wskazanie słabości tego rozwiązania, niech inni czytający mają pełen obraz i faktycznie lepsze rozwiązanie.

Następna dyskusja:

Usuwanie zdublowanych rekor...




Wyślij zaproszenie do